我正在使用.NET 4.0的任务并行库来执行长时间运行的任务。长时间运行的任务有不同的阶段,在每个阶段它完成我想将一些信息记录到文本文件或数据库。我没有在每个阶段调用日志方法,而是考虑使用发布者/订阅者模式,即在每个阶段,某些事件必须从长时间运行的任务中触发,而其他一些类必须监听这些事件并从事件中记录相应的信息宾语。
我不太清楚在多线程环境中使用事件。在TPL中使用事件以及如何做到这一点是一个好主意吗?寻找一些建议..
答案 0 :(得分:0)
您所描述的正是“Event based Asynchronous”模式。 BCL中的各个类也正在实施。例如:WebClient类有DownloadStringAsync方法,它在另一个线程上开始下载(使用TPL或其他),这个类公开了DownloadStringCompleted和DownloadProgressChanged(它完全映射到你在长时间运行的任务中完成的步骤)。
所以,基本上这可以很好地实现这种模式。问题是要记住这些事件将在运行任务的线程上引发,因此您需要确保这些事件的处理程序知道这一事实。