【问题标题】:Writing a Multi-threaded C# application编写多线程 C# 应用程序
【发布时间】:2011-01-19 06:56:11
【问题描述】:

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

我的一个想法是创建一些其他类,称为 PropertyClass,它将具有 TaskClass 的实例和与此 TaskClass 实例相关的一些属性。然后,每当 TaskClass 实例更改其状态时,PropertyClass 实例中的相关属性将得到更新,然后当从树视图列表中选择任务时,UI 将使用 PropertyClass 中的这些属性值进行更新。

可能会有数百个这样的任务在运行,它们将与远程机器上的服务进行通信。

我还能如何以有效的方式编写此解决方案?

【问题讨论】:

    标签: c# multithreading thread-safety


    【解决方案1】:

    首先阅读 MSDN the Task Parallel Library 上的此文档。

    【讨论】:

      【解决方案2】:

      我有一些建议。

      首先,您需要一种方法来确保您最终不会遇到阻止您的应用关闭的线程。一种可靠的方法是确保所有线程都是后台线程。如果您必须确保线程的工作在加入或中止之前完成,这可能会有点问题。

      其次,您可以考虑使用 ThreadPool 类,它应该可以更高效地创建和使用线程。线程池可帮助您管理线程。

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

      第四,BackgroundWorker 类可以在所有这些方面提供帮助,前提是它适合您的应用程序模型。

      第五,可以 BeginInvoked 事件和委托,这实际上将它们放在另一个线程上。这是一种隐式多线程,很有用。

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

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

      希望这会有所帮助。

      -内特

      【讨论】:

        【解决方案3】:

        如果每个 TaskClass 实例对应于树视图上的一个节点,您可以将 TaskClass 实例存储在树视图项的 Tag 属性中。或者,您可以创建一个 TaskClasses 字典,以唯一标识符(如 GUID)为键,并将标识符存储在 Tag 属性中。

        在任何一种情况下,都使用回调方法来表示 TaskClass 实例有更新。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          相关资源
          最近更新 更多