检查是否至少完成了一个线程

时间:2014-09-29 06:35:50

标签: c# multithreading

首先,我完全不熟悉C#中的线程。我创建了多个线程,如下所示。

if (flag)
{
    foreach (string empNo in empList)
    {
         Thread thrd = new Thread(()=>ComputeSalary(empNo));
         threadList.Add(thrd);
         thrd.Start();
    }
}

在继续进行之前,我需要检查是否至少有一个线程已完成执行,以便我可以执行其他操作。

我还尝试创建类型线程列表并将其添加到列表中,以便我可以检查至少有一个线程是否已完成其执行。我尝试使用thrd.IsAlive,但它总是给我当前的线程状态。

有没有其他方法可以检查线程上的atleast是否已完成执行?

2 个答案:

答案 0 :(得分:3)

您可以使用AutoResetEvent。

var reset = new AutoResetEvent(false); // ComputeSalary should have access to reset
.....
....

if (flag)
{
    foreach (string empNo in empList)
    {
         Thread thrd = new Thread(()=>ComputeSalary(empNo));
         threadList.Add(thrd);
         thrd.Start();
    }
    reset.WaitOne();
}

.....
.....

void ComputeSalary(int empNo)
{
    .....
    reset.set()
}

其他选项包括回调函数,事件或标志/计数器(不建议这样做)。

答案 1 :(得分:0)

以下是基于Task Parallel Library

的解决方案
// Create a list of tasks for each string in empList
List<Task> empTaskList = empList.Select(emp => Task.Run(() => ComputeSalary(emp)))
                                .ToList();

// Give me the task that finished first.
var firstFinishedTask = await Task.WhenAny(empTaskList); 

有几点需要注意:

  1. 要在您的方法中使用await,您必须将其声明为async Taskasync Task<T>,其中T是所需的返回类型< / p>

  2. Task.Run相当于new Thread().Start()。差异是Task.Run将使用ThreadPool(除非您明确告诉它不要),Thread类将构建一个全新的线程。

  3. 请注意await的使用。这告诉编译器将控制权交还给调用者,直到Task.WhenAny返回完成的第一个任务。

  4. 您应该详细了解async-await here