如何在MonoDroid中使用线程,使其与MonoTocuh跨平台兼容

时间:2013-04-10 19:52:53

标签: multithreading mono xamarin.ios xamarin.android

具体来说,当MonoDroid使用线程时,我发现的所有文档都建议调用RunOnUiThread()来调用回调。有一个类似的功能可用于MonoTouch,但它们都需要一个GUI(Activity或其对应部分在IOS上)。我想要的是能够启动一个线程,传入一个回调并在启动该线程的线程上调用该回调。例如

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


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

有什么想法吗?为了清楚起见,我希望这不需要处理Activity等。

3 个答案:

答案 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的精彩视频系列:

http://channel9.msdn.com/Series/Three-Essential-Tips-for-Async/Tip-1-Async-void-is-for-top-level-event-handlers-only

答案 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”在原始线程上执行。