【问题标题】:Converting the threads array to task and getting the name or task ID将线程数组转换为任务并获取名称或任务 ID
【发布时间】:2019-04-01 11:37:36
【问题描述】:

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

 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 是什么?

如果有更好的方法,我们将不胜感激。

【问题讨论】:

  • 如果您需要跟踪任务,为什么不简单地将它们添加到List&lt;Task&gt;?为什么需要名称或 ID?
  • 那是因为我必须在单独的字典中记录它。

标签: c# multithreading task


【解决方案1】:

Task 没有名称的概念。但是由于您似乎在您的 nodeKeys 数组中为每个 string 创建了一个 Task,因此您可以使用此 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&lt;Task&gt; 或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());

【讨论】:

  • 我认为您必须在捕获之前复制循环变量。
猜你喜欢
  • 2012-08-11
  • 2021-01-02
  • 2017-07-16
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多