Saya memiliki array utas dalam kode saya yang akan saya ganti dengan tugas.

 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();
 }

Ini adalah pendekatan lama di mana saya juga menyimpan nama utas saya di kamus terpisah. Sekarang saya akan mengubahnya menjadi tugas apa yang sejauh ini telah saya lakukan adalah ini

 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();
 }

Sekarang karena semua dalam for loop, haruskah semua ini dilakukan dalam satu tugas? Atau jika pendekatan di atas benar, bagaimana dengan id tugas yang harus saya dapatkan?

Atau jika ada pendekatan yang lebih baik untuk melakukannya akan dihargai.

0
Haroon nasir 1 April 2019, 14:37

1 menjawab

Jawaban Terbaik

Task tidak memiliki konsep nama. Tetapi karena Anda tampaknya membuat Task per string dalam larik nodeKeys, Anda dapat menggunakan string ini sebagai kunci asalkan unik:

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]));
}

Opsi lain mungkin hanya menambahkan tugas apa adanya, tanpa pengenal apa pun, ke List<Task> atau Task[]:

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

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

Anda dapat menunggu serangkaian tugas menggunakan Metode Task.WhenAll:

await Task.WhenAll(tasks.ToArray());
//or await Task.WhenAll(tasks.Values.ToArray());
1
mm8 1 April 2019, 12:02