C#中的主题[问题]

时间:2010-05-02 16:45:51

标签: c# .net

Thread1 / 2:在退出时执行TotalThreads--

int TotalThreads = 2;

void AsyncFunc() {
 // run thread for Func()
}

void Func() {
 // run Thread1 
 // run Thread2
 while(TotalThreads > 0) { /* do nothing */ }
 // some code
}  

是不好的设计?

5 个答案:

答案 0 :(得分:4)

如果使用System.Threading.Thread创建新线程,则可以在每个线程实例上使用Thread.Join。这将阻塞主线程,直到运行的线程完成。

根据您的评论,此示例应符合您的要求。

using System;
using System.Threading;

namespace ConsoleApplication1
{
  class Program
  {
    [STAThread]
    static void Main(string[] args)
    {

      Thread t1 = new Thread(new ThreadStart(AsyncFunc));
      Thread t2 = new Thread(new ThreadStart(AsyncFunc));

      t1.Start();
      t2.Start();

      // Wait here for the 2 threads to complete
      t1.Join();
      t2.Join();

      Console.WriteLine("Done");
      Console.ReadKey();
    }


    static void AsyncFunc()
    {
      Thread.Sleep(2000);
    }

  }
}  

答案 1 :(得分:3)

我假设这意味着你在每个线程中完成时会减少TotalThreads吗?您必须同步对变量的访问权限,否则您将遇到竞争条件。

一般来说,有更好的做事方式。最简单的方法是在代码末尾显式连接每个线程,等待它们终止:

thread1.Join()
thread2.Join()

如果你想为多个线程执行此操作,可以将它们全部放入List,然后将Join全部放在foreach循环中。

如果您只想运行几个AsyncFunc,更好的方法是使用.NET 4.0中提供的Parallel Extensions,或者在Reactive Extensions库中向后移植到3.5:

Parallel.Invoke(AsyncFunc, AsyncFunc); 

这将并行运行两个函数副本,并在它们完成后返回。

答案 2 :(得分:1)

使用“忙等待”(这就是你在while循环中所做的事情)绝不是一个好主意。 让每个线程在通过委托完成时发出信号并在该事件处理程序中减少你的totalthreads计数器(不要忘记在该操作期间锁定计数器)。

当所有线程都完成后,调用另一个函数,该函数将继续您想要做的任何事情。

答案 3 :(得分:1)

查看Thread.Join以获取let-wait-for-threads-to-finish synchronization。

答案 4 :(得分:0)

听起来你想要Thread.Join()方法。