与异步委托(delegate)一起使用的模式之一也是回调模式,其中初始线程(调用 BeginInvoke 的线程)T1 继续运行,无需等待或检查生成的线程 T2 是否已完成。相反,当 T2 完成时,T2 调用处理结果的回调方法,调用 EndInvoke 并通知 T1 任务已完成。
a) 如果回调方法应该在任务完成时通知 T1,那么为什么不在 T1 而不是 T2 内部调用此回调方法?
2) 回调方法应该如何通知 T1 T2 已完成,是否有一些标准模式?
3)即使T1需要接收异步调用方法的返回值,是否也应该使用回调模式?
谢谢
最佳答案
- 为什么没有在T1调用回调方法?
通常这是不可能的;如果 T1 停止做一些其他工作,则无法将工作编码回它,除非该线程已经具有用于在其上发布和安排工作的机制(例如,UI 线程,通过 SynchronizationContext)。
- 是否有跨线程通知的标准模式?
我会说不;有许多跨线程同步模式,每种模式适用于不同的目标场景。
- 如果 T1 需要返回值怎么办?
如果T1需要当前栈下的返回值,那么最终它要阻塞才能得到它。阻塞可能通过调用 EndInvoke、使用 WaitHandle 或上一条中的其他策略来实现。
如果需要返回值的东西“只是线程”(例如 UI 线程)而不是在特定的调用堆栈/激活上下文下,那么通常使用 SynchronizationContext.Post 或 Dispatcher.Invoke 来编码最终返回的工作准备就绪后发送到 UI 线程。
关于c# - 异步委托(delegate)什么时候应该使用回调模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2352365/