0

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

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


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

有任何想法吗?需要明确的是,我希望这不需要 Activity 等的句柄。

4

3 回答 3

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));
        });
    }

我希望这有帮助。

于 2013-04-10T20:29:22.007 回答
1

使用 Alpha 版本(希望很快可以稳定使用),您可以使用新的 Async await 习惯用法。

这是 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

于 2013-04-11T09:04:28.767 回答
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”在原始线程上执行。

于 2013-04-11T01:02:58.187 回答