将线程数组转换为任务并获取名称或任务ID

时间:2019-04-01 11:37:36

标签: c# multithreading task

我的代码中有线程数组,将用任务替换。

 Dictionary<string, name> threadnames = new Dictionary<string, name>();
 public Thread [] Threads;
 string[] nodeKeys;

 for (int i = 0; i < nodeKeys.Length; i++)
 {
   Threads[i] = new Thread(() => ThreadMethod(nodeKey));
   Threads[i].Name = nodeKey[i];
   names.Add(Threads[i].Name, null);
   Threads[i].Start();
 }

这是旧的方法,我也将线程名保存在单独的字典中。现在,我要将其转换为任务,到目前为止,我已经完成了

 Dictionary<string, name> threadnames = new Dictionary<string, name>();
 string[] nodeKeys;

 for (int i = 0; i < nodeKeys.Length; i++)
 {
  var runningTask = new Task(() => ThreadMethod(nodeKey[i]));
  runningTask.Start();
 }

现在既然所有内容都在for循环中,那么所有这些都应该在单个任务中完成吗?还是如果上述方法正确,那我必须获得的任务ID怎么办?

或者,如果有更好的方法,将不胜感激。

1 个答案:

答案 0 :(得分:1)

Task没有名称的概念。但是由于您似乎在Task数组中为每个string创建了一个nodeKeys,因此可以使用此string作为键,只要它是唯一的:

Dictionary<string, Task> tasks = new Dictionary<string, Task>();
string[] nodeKeys;

for (int i = 0; i<nodeKeys.Length; i++)
{
    tasks[nodeKey[i]] = Task.Run(() => ThreadMethod(nodeKey[i]));
}

另一种选择可能是将任务按原样添加到List<Task>Task[]中,而没有任何标识符:

List<Task> tasks = new List<Task>();
string[] nodeKeys;

for (int i = 0; i<nodeKeys.Length; i++)
{
    tasks.Add(Task.Run(() => ThreadMethod(nodeKey[i])));
}

您可以使用Task.WhenAll方法等待一系列任务:

await Task.WhenAll(tasks.ToArray());
//or await Task.WhenAll(tasks.Values.ToArray());