将异步操作结果返回给原始线程

时间:2015-09-28 06:45:34

标签: c# .net multithreading

是否可以将async operation的结果返回给发起它的线程(即原始线程中调用的AsyncCallback)?

这是一个例子

    void Main(string[] args)
    {

        Func<bool> action = () =>
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Running");
            return true;
        };

        AsyncCallback onComplete = (r) =>
        {
            bool result = action.EndInvoke(r);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Completed");
        };

        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Main");
        IAsyncResult iar = action.BeginInvoke(onComplete, null);
    }

它的输出类似于:

5: Main
6: Running
6: Completed

我想要实现的是在主线程中执行的onComplete回调(例如,Completed和Main将在此示例中打印相同的线程ID)

(我知道这可以通过BackgroundWorker来实现,即它的RunWorkerCompleted事件在原始线程中被触发,因此在后台线程中调用的函数的返回值可以返回原始主题)

1 个答案:

答案 0 :(得分:5)

这主要是您选择使用的SynchronizationContextTaskScheduler实现的问题。在许多UI框架(winforms,WPF等)的情况下,则是:如果您开始在UI线程上工作,则回调可以在UI线程上发生 - 但这不适用于一般情况,其中{{ 1}}线程更有可能获胜。最终,您不能简单地强制工作回到特定线程,除非该线程按设计检查某些工作队列,并且出列/执行工作包当他们到达时(这正是UI框架所做的)。