我的代码中有线程数组,将用任务替换。
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怎么办?
或者,如果有更好的方法,将不胜感激。
答案 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());