c# - 异步委托(delegate)什么时候应该使用回调模式?

标签 c# design-patterns delegates

与异步委托(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/

相关文章:

c# - Entity Framework 6、存储库模式和工作单元

java - 装饰器模式在 Java 中具有特定于装饰器的方法

c# - 如何自动测试我的数据库驱动功能?

c# - 通过Nest在Elasticsearch中使用同义词

php - 复合模式和依赖注入(inject)

C# 委托(delegate)给结构方法

c# - 代码如何通过引用传递?

c# - Lambda 和类型推断

javascript - 将服务器端变量传递给链接的 javascript 文件

c# - 如何检查数组索引是否超出范围?