讨论:在.NET中的线程化。

16 浏览
0 Comments

讨论:在.NET中的线程化。

我想和你讨论一下在.NET中的线程“事物”。\n虽然其他语言/框架提供了有限而明确的方法来处理异步调用,但在.NET中有无数种方法。\n我在这里打算尝试定义一种“特定情况下的最佳实践”。换句话说:在什么情况下使用哪种线程方法?\n让我们先列举一下我们如何使代码异步运行的方式:\n

    \n

  • Thread(new Thread)
  • \n

  • ThreadPool(ThreadPool.QueueUserWorkItem)
  • \n

  • BackgroundWorker(BackgroundWorker.RunWorkerAsync)
  • \n

  • Delegate(Delegate.BeginInvoke)
  • \n

  • Task Parallels Library
  • \n

  • Parallel Class(Parallel.ForEach)
  • \n

\n
[我有漏掉的吗?]\n以下是我决定使用哪种类型的方式:
\nThread - 通常在我需要对线程进行完全控制时使用,例如服务的主线程。
\nThreadPool - 适用于不需要高优先级的短任务 - 比如我们有一个与UI连接的IPC,我只需要放松一下这些调用,以免阻塞UI。
\nBackgroundWorker - UI项目 -> 加载/闪屏界面
\nDelegate - 通常仅在我需要与UI线程同步时使用(Dispatcher/Form .Invoke)
\nTask Parallels Library - 尚未使用,我猜它是“委托方式”的一个很好的替代品,用于同步UI
\nParallel - 如果我需要为多个对象执行一些代码 - 例如,有一个来自不同服务器的邮件集合,我需要对每个邮件执行某些操作。\n现在轮到你了,你是如何决定在何时使用哪种方式的?\n如果这个讨论进行得很好,我还想添加信号量主题。

0
0 Comments

在讨论中提到了多线程在.NET中的使用以及解决方法。以下是对问题的出现原因和解决方法的整理:

问题的出现原因:

- 程序员往往很难确定理想的线程数量,因此无法完全掌控线程的数量。

- .NET线程池并不是所有人的首选,一些人希望使用真正的线程而不是线程池。

解决方法:

- 使用Thread类:Thread类适用于那些希望使用真正的线程而不是线程池的人。但是需要注意选择合适的线程数量。

- 使用ThreadPool类:ThreadPool类是.NET提供的解决方案,用于确定最佳线程数量。但是,这个API不是最好的选择,新项目建议使用TPL。

- 使用BackgroundWorker类:如果你希望从GUI应用程序中轻松启动线程并进行简单的回调,可以使用BackgroundWorker类。它提供了最简单的API。

- 使用Dispatcher类:Dispatcher类用于回调到GUI线程。这对于这种情况非常重要。没有其他方法可以使用它,除非使用一些我不知道的代码。

- 使用Task Parallel Library(TPL):TPL是在.NET 4中引入的,并推荐在新项目中使用。

- 使用Parallel类:Parallel类提供了一种在多个线程中执行循环的便捷方法。通过使用Parallel.For(或ForEach),可以在多个线程上运行循环,以加快循环的速度。

以上是对问题的出现原因和解决方法的整理。在.NET中,根据具体需求和项目情况,可以选择合适的线程处理方式。

0