【发布时间】:2011-01-19 02:23:37
【问题描述】:
问题描述:您编写了一个库,其中包含一些可能需要很长时间才能完成的算法/任务,原因有很多:计算、文件系统、网络通信等。您希望能够到:
- 发送有关任务的一些进度信息(进度、活动记录等)
- 如果设置了某些外部信号或属性,则有办法在完成之前中止任务。
我为此实现了一个框架,但这要求所有此类任务都必须引用包含此框架的程序集。
我的问题:.NET 框架(3.5 或更低版本)中是否已经有内置机制来解决上述问题?
我知道我可以使用事件,但这意味着长时间运行的任务必须公开此类事件,我认为这是一种开销。理想情况下,我希望有一个框架可以隐藏多线程问题并且对依赖注入友好,但不依赖于额外的自定义程序集并且不会污染原始接口。
我希望我对问题的描述足够好。如果没有,我可以从我自己的框架中发布一些接口示例。
更新:好的,我认为我的问题描述需要澄清一下 :)。当我说“长时间运行”时,我并不是指工作流意义上的“长时间”。我正在开发一个 WinForms 映射应用程序,它可以做各种各样的事情,比如生成 relief contours。为此,它首先必须从 FTP 服务器下载高程数据文件,解压缩它们,然后执行一些计算。我很早以前就为此编写了代码,但为了使其对 GUI 更友好,我必须重新安装各种检查 - 例如,检测用户已单击 Abort 按钮并停止进程。
所以基本上我关心的是:如何编写可以在以后(如果有的话)在 GUI 环境中使用的代码,您不能简单地在主 GUI 线程中运行所有内容并冻结整个应用程序。 挑战在于找到一种方法,使您的代码适用于 GUI 目的,而无需将其绑定到特定的 GUI 平台。
【问题讨论】:
-
第一个想法_您可以考虑使用 System.Diagnostics.PerformanceCounter 进行数字活动记录。然后任何知道其名称的应用程序都可以读取数据。要发出中止信号,您可以使用带有命名句柄的 EventWaitHandle。这两种方法都不需要 dll 链接,但它们需要共享的“字符串”命名。或者像@mark 建议的那样走 WWF 路线。
-
我想避免“干净和无辜”的库代码与等待句柄、线程和 WMI 等棘手的代码混在一起;)我正在寻找这些模式的抽象(最好通过 C#接口,使其更具可测试性)。
标签: c# multithreading user-interface asynchronous synchronization