首先,我完全不熟悉C#中的线程。我创建了多个线程,如下所示。
if (flag)
{
foreach (string empNo in empList)
{
Thread thrd = new Thread(()=>ComputeSalary(empNo));
threadList.Add(thrd);
thrd.Start();
}
}
在继续进行之前,我需要检查是否至少有一个线程已完成执行,以便我可以执行其他操作。
我还尝试创建类型线程列表并将其添加到列表中,以便我可以检查至少有一个线程是否已完成其执行。我尝试使用thrd.IsAlive
,但它总是给我当前的线程状态。
有没有其他方法可以检查线程上的atleast是否已完成执行?
答案 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);
有几点需要注意:
要在您的方法中使用await
,您必须将其声明为async Task
或async Task<T>
,其中T
是所需的返回类型< / p>
Task.Run
相当于new Thread().Start()
。差异是Task.Run
将使用ThreadPool
(除非您明确告诉它不要),Thread
类将构建一个全新的线程。
请注意await
的使用。这告诉编译器将控制权交还给调用者,直到Task.WhenAny
返回完成的第一个任务。
您应该详细了解async-await
here