什么时候异步委托应该使用回调模式?

时间:2010-02-28 19:42:03

标签: c# design-patterns delegates

与异步委托一起使用的模式之一也是回调模式,其中初始线程(一个调用BeginInvoke)T1继续而不等待或检查生成的线程T2是否已完成。相反,当T2完成时,T2调用回调方法,该方法处理结果,调用EndInvoke并通知T1任务已完成。

a)如果回调方法应该在任务完成时通知T1,那么为什么这个回调方法不在T1内调用而不是T2?

2)是否有一些标准模式如何回调方法应该告知T1 T2已经完成?

3)即使T1需要接收异步调用方法的返回值,是否应该使用回调模式?

感谢名单

2 个答案:

答案 0 :(得分:3)

  • 为什么不在T1中调用回调方法?

一般来说这是不可能的;如果T1没有做其他工作,那么除非线程已经有一个机制来发布和调度工作(例如UI线程,通过SynchronizationContext),否则没有办法将工作重新编写回来。

  • 是否有跨线程通知的标准模式?

我会说不;有许多跨线程同步模式,每种模式都适用于不同的目标场景。

  • 如果T1需要返回值怎么办?

如果T1需要当前堆栈下的返回值,那么最终它将不得不阻塞以获取它。阻止可能通过使用WaitHandle或前一个项目中的其他策略调用EndInvoke来实现。

如果需要返回值的东西是“只是线程”(例如UI线程)而不是特定的callstack /激活上下文,那么通常使用SynchronizationContext.Post或Dispatcher.Invoke来最终将工作编组一旦准备好就进入UI线程。

答案 1 :(得分:3)

让一个线程在另一个线程中运行代码是非常不重要的。但它是Windows窗体和WPF应用程序的常见要求,用户界面组件从不是线程安全的。它们有一个共同的模式,分别是Control.Invoke和Dispatcher.Invoke方法。还有一个标准的助手类BackgroundWorker。它在UI线程上引发事件,它类似于回调方法是RunWorkerCompleted事件。

如果您更喜欢使用委托的BeginInvoke()方法,您当然可以使用自己的机制,但是正确使用它可能会很棘手。