Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的线程[问题]_C#_.net - Fatal编程技术网

C#中的线程[问题]

C#中的线程[问题],c#,.net,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 } 这是一个糟糕的设计吗?使用“忙等待”(while循环就是这样做的)

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
}  
这是一个糟糕的设计吗?

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


所有线程完成后,调用另一个函数,该函数将继续执行下一步要执行的操作。

查看是否让我们等待线程完成同步。

如果使用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);
    }

  }
}  

听起来你想要这个方法。

我假设这意味着你在每个线程完成时减少了
TotalThreads
?您必须同步对该变量的访问,否则将出现竞争条件

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

thread1.Join()
thread2.Join()
如果要对多个线程执行此操作,可以将它们全部放入
列表
,然后将它们全部加入
foreach
循环中

如果您只想运行两个
AsyncFunc
,更好的方法是使用.NET 4.0中提供的并行扩展,或库中的后端口到3.5:

Parallel.Invoke(AsyncFunc, AsyncFunc); 

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

我试图找出N个线程是否已完成。是否尝试通过轮询TotalThreads来等待所有线程完成?如果是这样,这不是一个好办法。但请澄清您的问题。这正是我想要的,但我想要最简单的解决方案。您是如何运行线程的,作为新线程,还是在线程池中使用QueueUserWorkItem或Delegate.BeginInvoke等?为什么要在标题中添加
[question]
?是否已经很明显您正在发布一个问题?好的,但是代理在调用它们的线程中运行。我想关闭每个线程,只在主线程上继续我的工作。如何做到这一点。