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

Multithreading 我如何在MonoDroid中使用线程,使其与MonoTocuh跨平台兼容,multithreading,mono,xamarin.ios,xamarin.android,Multithreading,Mono,Xamarin.ios,Xamarin.android,特别是在MonoDroid使用线程时,我能找到的所有文档都建议调用RunOnUiThread()来调用回调。MonoTouch上也可以使用类似的功能,但两者都需要GUI(活动或IOS上的任何计数器部件)。我希望能够启动一个线程,传入一个回调,并在启动该线程的线程上调用该回调。比如说 ThreadPool.QueueUserWorkItem(state => { //Do Stuff execute_callback_magically_on_main_thread(()

特别是在MonoDroid使用线程时,我能找到的所有文档都建议调用RunOnUiThread()来调用回调。MonoTouch上也可以使用类似的功能,但两者都需要GUI(活动或IOS上的任何计数器部件)。我希望能够启动一个线程,传入一个回调,并在启动该线程的线程上调用该回调。比如说

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


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

有什么想法吗?说清楚一点,我希望这样做不需要活动的句柄等。

如果您这样做会怎么样?(假设他们有相同的签名)我没有弄乱
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));
        });
    }

我希望这能有所帮助。

我找到了一个可行的解决方案,而且似乎不依赖于任何一个平台

Task<string> t = new Task<string>(() =>
{
    //Do Stuff
    return "my results";
});
t.ContinueWith(task =>{
    if(callback != null)
         callback(task.Result);
    }, TaskScheduler.FromCurrentSynchronizationContext());
t.Start();
Task t=新任务(()=>
{
//做事
返回“我的结果”;
});
t、 继续(任务=>{
if(回调!=null)
回调(task.Result);
},TaskScheduler.FromCurrentSynchronizationContext());
t、 Start();
重要的部分是TaskScheduler.FromCurrentSynchronizationContext(),它告诉“ContinueWith”在原始线程上执行。

使用Alpha构建(希望很快可以稳定使用),您可以使用新的异步等待习惯用法

以下是MSDN的概述:

下面是一个关于第9频道的精彩视频系列:


这也是我的第一个想法。但是为了在android上实现这一点,您必须对活动进行引用,在IOS中,您必须对NSObject进行引用。我在库中进行这些调用,因为我试图从ui中分割逻辑,所以获得这些引用并不容易。我可以传递它们,但它们并不真正共享一个共同的祖先。为什么不直接引发一个事件,让视图本身决定如何在其自己的平台特定机制中将其封送到UI线程?我想重点是,您需要在UI线程上执行一些特定的操作,而不仅仅是能够执行后台任务?我想需要的是能够在UI线程上执行的东西,只要UI线程启动它,它就可以执行。由于“FromCurrentSyncronizationContext()”调用,ContinueWith部分在父线程上执行。