我需要在c#中编写一个跟踪多个任务的应用程序,每个任务都是作为在自己的线程上运行的类实例实现的。用户界面将用于显示每个任务实例的状态,具体取决于我从树视图中选择的任务,该任务将显示任务列表。
我的想法是创建一些名为PropertyClass的其他类,它将具有TaskClass的实例以及与此TaskClass实例相关的一些属性。然后,每当TaskClass实例更改其状态时,PropertyClass实例中的相关属性将更新,然后当从树视图列表中选择任务时,将使用PropertyClass中的这些属性值更新UI。
可能会有数百个这样的任务正在运行,这些任务将与远程计算机上的服务进行通信。
我怎样才能以有效的方式编写此解决方案?
答案 0 :(得分:4)
首先在the Task Parallel Library上的MSDN上阅读此文档。
答案 1 :(得分:1)
我有一些建议。
首先,您需要一种方法来确保您最终没有线程阻止您的应用关闭。一个确定的方法是确保所有线程都是后台线程。如果您必须确保线程的工作在加入或中止之前完成,那么这可能会有点问题。
其次,您可以查看使用ThreadPool类,它应该使创建和使用线程更有效。线程池可以帮助您管理线程。
第三,您需要一种方法,将GUI中的数据访问与其他线程中的数据同步。在WPF中,您使用Dispatcher,在WinForms中,您将使用Invoke。
第四,如果BackgroundWorker类适合您的应用程序模型,它可以帮助解决所有这些问题。
第五,事件和委托可以是BeginInvoked,它基本上将它们放在另一个线程上。它是一种隐式多线程,可能很有用。
第六,我还没有机会使用它,.Net 4有可能对你有用的并行任务库。
第七,可以使用lock和/或Monitor来完成安全的共享数据访问和同步。
希望这有帮助。
-Nate
答案 2 :(得分:0)
如果每个TaskClass实例对应于树视图上的节点,则可以将TaskClass实例存储在树视图项的Tag属性中。或者,您可以创建一个TaskClasses字典,由唯一标识符(如GUID)键入,并将标识符存储在Tag属性中。
在任何一种情况下,都使用回调方法来表示TaskClass实例有更新。