2013-04-10 10 views
0

特别是在做MonoDroid使用线程时,我能找到的所有文档都建议调用RunOnUiThread()来调用回调。有一个类似的功能可以在MonoTouch上使用,但是它们都需要一个GUI(Activity或者任何它的计数器部分在IOS上)。我想要的是能够启动一个线程,传递一个回调,并在启动该线程的线程上调用该回调。例如如何在MonoDroid中使用线程,使其与MonoTocuh跨平台兼容

ThreadPool.QueueUserWorkItem(state => 
{ 
    //Do Stuff 


    execute_callback_magically_on_main_thread(() => callback(response)); 
}); 

任何想法?要清楚我宁愿这不需要处理活动等。

+0

为什么不只是引发一个事件,让视图本身确定如何通过它自己的平台特定机制将它封送到UI线程? – ctacke 2013-04-10 23:28:17

回答

0

我发现了一个可以工作的解决方案,似乎不依赖于任一平台。

Task<string> t = new Task<string>(() => 
{ 
    //Do Stuff 
    return "my results"; 
}); 
t.ContinueWith(task =>{ 
    if(callback != null) 
     callback(task.Result); 
    }, TaskScheduler.FromCurrentSynchronizationContext()); 
t.Start(); 

最重要的部分是,它告诉“ContinueWith”原来的线程上执行TaskScheduler.FromCurrentSynchronizationContext()。

+0

我认为重点是你需要在UI线程上执行的某些东西,而不是仅仅能够执行后台任务? – valdetero 2013-04-11 14:48:33

+0

我需要的是能够在UI线程上执行的东西,只要UI线程启动它即可。由于“FromCurrentSyncronizationContext()”调用,ContinueWith部分在父线程上执行。 – 2013-04-11 21:29:40

1

如果你做这样的事情? (假设他们有相同的签名)我没有与RunOnUiThread混淆,所以我不知道它的签名。

public delegate void InvokeOnUIMethod(Action action); 

    public void CallingMethod() 
    { 
     //iOS 
     MyMethod(InvokeOnMainThread,() => { /* Your callback functionality */ }); 

     //Android 
     MyMethod(RunOnUiThread,() => { /* Your callback functionality */ }); 
    } 

    public void MyMethod(InvokeOnUIMethod execute_callback_magically_on_main_thread, Action callback) 
    { 
     System.Threading.ThreadPool.QueueUserWorkItem(state => 
     { 
      //Do Stuff 

      execute_callback_magically_on_main_thread(() => callback(response)); 
     }); 
    } 

我希望这有助于。

+0

这也是我的第一个想法。但为了使这个工作在android上,你必须有一个对Activity的引用,并且在IOS中你必须引用NSObject。我正在从库中调用这些调用,因为我试图从我的用户界面中分割出我的逻辑,所以这些引用并不容易。我可以通过他们,但他们并不真正分享共同的祖先。 – 2013-04-10 22:31:35