具体来说,当MonoDroid使用线程时,我发现的所有文档都建议调用RunOnUiThread()来调用回调。有一个类似的功能可用于MonoTouch,但它们都需要一个GUI(Activity或其对应部分在IOS上)。我想要的是能够启动一个线程,传入一个回调并在启动该线程的线程上调用该回调。例如
ThreadPool.QueueUserWorkItem(state =>
{
//Do Stuff
execute_callback_magically_on_main_thread(() => callback(response));
});
有什么想法吗?为了清楚起见,我希望这不需要处理Activity等。
答案 0 :(得分: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));
});
}
我希望这会有所帮助。
答案 1 :(得分:1)
使用Alpha版本(希望很快可以稳定使用),你可以使用新的Async await idiom。
这是对MSDN的概述:
http://msdn.microsoft.com/en-gb/library/vstudio/hh191443.aspx
这是关于Channel9的精彩视频系列:
答案 2 :(得分: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();
重要的部分是TaskScheduler.FromCurrentSynchronizationContext(),它告诉“ContinueWith”在原始线程上执行。