可以将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
事件,因此可以在后台线程中调用的函数的返回值返回到原始线程) 最佳答案
对于您选择使用的SynchronizationContext
和TaskScheduler
实现,这在很大程度上是一个问题。在许多UI框架(winforms,WPF等)的情况下,是:如果在UI线程上开始工作,则回调可能在UI线程上发生-但这不适用于ThreadPool
线程的一般情况更有可能获胜。最终,您不能简单地将工作强制返回特定的线程,除非该线程是通过设计检查某些工作队列,并在工作包到达时对其进行出队/执行(这正是UI框架所做的工作)。
关于c# - 将异步操作结果返回到原始线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32817091/