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
回调在主线程(如已完成,并主要将执行。在这个例子中印有相同的线程ID)
(我知道这可以通过BackgroundWorker
来实现,即它是RunWorkerCompleted
事件在原始线程中触发,因此在后台线程中调用的函数的返回值可以返回到原始线程)
那么为什么不使用BackgroundWorker呢?它不是密封的,所以你甚至可以从它中派生出来添加你自己的魔法。 – Nebula
交谈中,您可能可以发送对主线程的引用以及任务并跨线程访问它。但要测试并确保它始终有效? Brrr ... – Nebula
@Nebula对'Thread'的访问不允许你将* work *推送到一个线程;为此,您需要某种工作队列机制。 –