Übergabe des Wertparameters an Task in c #

Ich habe ein Problem mit der Übergabe eines langen Werts an eine Aufgabe.

Ich habe eine Liste von IDs, in denen ich jede durchschleife, einer lokalen Variablen zuordnet und dann als Parameter an eine neue Task übergebe. Ich warte nicht, bis die Aufgabe abgeschlossen ist, bevor ich eine Schleife durchführe und die nächste ID verarbeite. Ich behalte eine Reihe von Aufgaben, aber das ist irrelevant.

loop
    long ID = list[index];
    task[index] = Task.Factory.StartNew(() => doWork(ID));
end loop

Wenn die Liste beispielsweise 100 und 200 enthält, möchte ich, dass die erste Task mit 100 und die zweite mit 200 aufgerufen wird. Ist dies jedoch nicht der Fall, erhält doWork 200 für beide Tasks, sodass beim Kopieren des Werts ein Problem auftritt.

Ich kann mit etwas einfachem Konsolencode demonstrieren

class Program
{
   static void Main(string[] args)
   {
      long num = 100;
      Task one = Task.Factory.StartNew(() => doWork(num));
      num = 200;

      Console.ReadKey();
   }

   public static void doWork(long val)
   {
      Console.WriteLine("Method called with {0}", val);
   }
 }

Der obige Code wird immer angezeigt

Methode mit 200 aufgerufen

Ich habe den Code so geändert, dass gewartet wird, bis der Taskstatus von WaitingToRun wechselt

static void Main(string[] args)
{
   long num = 100;
   Task one = Task.Factory.StartNew(() => doWork(num));
   while(one.Status == TaskStatus.WaitingToRun)
   {}
   num = 200;

   Console.ReadKey();
}

Dies verbessert die Dinge, aber nicht 100% Beweis, nach ein paar Läufen bekam ich Methode mit 200 aufgerufen

Habe auch folgendes probiert

while (true)
{
    if (one.Status == TaskStatus.Running | one.IsCompleted == true)
    break;
}

habe aber nochmal 200 angezeigt bekommen.

Gibt es Ideen, wie Sie den an die Aufgabe übergebenen Wert garantieren können, ohne auf die Fertigstellung der Aufgabe zu warten?

Jede Hilfe / Anregungen geschätzt Ade

Antworten auf die Frage(1)

Ihre Antwort auf die Frage