与异步委托一起使用的模式之一也是回调模式,其中初始线程(一个调用BeginInvoke)T1继续而不等待或检查生成的线程T2是否已完成。相反,当T2完成时,T2调用回调方法,该方法处理结果,调用EndInvoke并通知T1任务已完成。
a)如果回调方法应该在任务完成时通知T1,那么为什么这个回调方法不在T1内调用而不是T2?
2)是否有一些标准模式如何回调方法应该告知T1 T2已经完成?
3)即使T1需要接收异步调用方法的返回值,是否应该使用回调模式?
感谢名单
答案 0 :(得分:3)
一般来说这是不可能的;如果T1没有做其他工作,那么除非线程已经有一个机制来发布和调度工作(例如UI线程,通过SynchronizationContext),否则没有办法将工作重新编写回来。
我会说不;有许多跨线程同步模式,每种模式都适用于不同的目标场景。
如果T1需要当前堆栈下的返回值,那么最终它将不得不阻塞以获取它。阻止可能通过使用WaitHandle或前一个项目中的其他策略调用EndInvoke来实现。
如果需要返回值的东西是“只是线程”(例如UI线程)而不是特定的callstack /激活上下文,那么通常使用SynchronizationContext.Post或Dispatcher.Invoke来最终将工作编组一旦准备好就进入UI线程。
答案 1 :(得分:3)
让一个线程在另一个线程中运行代码是非常不重要的。但它是Windows窗体和WPF应用程序的常见要求,用户界面组件从不是线程安全的。它们做有一个共同的模式,分别是Control.Invoke和Dispatcher.Invoke方法。还有一个标准的助手类BackgroundWorker。它在UI线程上引发事件,它类似于回调方法是RunWorkerCompleted事件。
如果您更喜欢使用委托的BeginInvoke()方法,您当然可以使用自己的机制,但是正确使用它可能会很棘手。