繁体   English   中英

编写多线程C#应用程序

[英]Writing a Multi-threaded C# application

我需要用c#编写一个应用程序,以跟踪多个任务,每个任务都作为在其自己的线程上运行的类实例来实现。 用户界面将用于显示每个任务实例的状态,具体取决于我从树状视图中选择的任务,该任务将显示任务列表。

我的想法是创建另一个名为PropertyClass的类,该类将具有TaskClass的实例以及与此TaskClass实例相关的一些属性。 然后,每当TaskClass实例更改其状态时,都会更新PropertyClass实例中的相关属性,然后从Tree View列表中选择任务时,将使用PropertyClass中的这些属性值来更新UI。

这些任务可能正在运行数百个,这些任务将与远程计算机上的服务进行通信。

我还能如何有效地编码此解决方案?

首先从MSDN上的Task Parallel库中阅读此文档。

我有一些建议。

首先,您需要一种方法来确保不会导致线程阻塞您的应用程序关闭。 一种可靠的解决方法是确保所有线程均为后台线程。 如果必须确保在加入或中止线程之前完成线程的工作,这可能会有些问题。

其次,您可以看看使用ThreadPool类,它应该使创建和使用线程更加有效。 线程池可以帮助您管理线程。

第三,您将需要一种将来自GUI的数据访问同步到其他线程中的数据的方法。 在WPF中,您可以使用Dispatcher;在WinForms中,您可以使用Invoke。

第四,如果BackgroundWorker类适合您的应用程序模型,则它可以提供所有帮助。

第五,事件和委托可以被BeginInvoked所使用,这实际上将它们置于另一个线程上。 它是一种隐式多线程,非常有用。

第六,我还没有机会使用它,.Net 4具有并行任务库,可能对您有用。

第七,可以使用锁定和/或监控器来完成安全共享数据的访问和同步。

希望这可以帮助。

-Nate

如果每个TaskClass实例与树视图上的一个节点相对应,则可以将TaskClass实例存储在树视图项的Tag属性中。 或者,您可以创建TaskClasses的词典,并用诸如GUID之类的唯一标识符作为关键字,然后将该标识符存储在Tag属性中。

在这两种情况下,都应使用回调方法来表示TaskClass实例具有更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM