繁体   English   中英

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

[英]Return async operation result to the original thread

是否可以将异步操作的结果返回到发起该操作的线程(即,在原始线程中调用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事件,因此可以将在后台线程中调用的函数的返回值返回到原始线程)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM