Преобразование массива потоков в задачу и получение имени или идентификатора задачи - PullRequest
0 голосов
/ 01 апреля 2019

В моем коде были массивы потоков, которые я собираюсь заменить на задачу.

 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, все это должно быть выполнено в одной задаче?Или, если вышеприведенный подход правильный, как насчет идентификатора задачи, который я должен получить?

Или, если есть лучший подход, он будет оценен.

1 Ответ

1 голос
/ 01 апреля 2019

A 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());
...