2016-05-16 12 views
0

Ich lerne Threading in diesen Tagen und war verwirrt zwischen dem Erstellen einer synchronen und asynchronen Aufgabe.Ich habe ein Stück Code geschrieben und es funktioniert nicht.Kann mir jemand einen Hinweis geben, was hier falsch ist.Synchron Task funktioniert nicht

Ich weiß, es könnte eine einfache Frage sein, aber wird mir wirklich helfen, das Konzept zu bekommen.

Was ich will - Sync Task 1 sollte Daten nur nach Sync-Task 2 geben und Sync-Task 3 ist asynchron.

Auch ich möchte es über Aufgabe tun und nicht Thread, wenn jemand helfen kann.

Vielen Dank im Voraus.

using System; 
using System.Threading; 
using System.Threading.Tasks; 

public class Example 
{ 
    public static void Main() 
    { 

     var syncTask1 = Task.Factory.StartNew(() => 
     { 


      for (int ctr = 1; ctr <= 10; ctr++) 
       Console.WriteLine(ctr.ToString() + "1"); 
     }); 
     var syncTask2 = new Task(() => 
     { 


      for (int ctr = 1; ctr <= 10; ctr++) 
      { 
       Console.WriteLine(ctr.ToString() + "2"); 

      } 


     }); 
     syncTask2.Start(); 

     var syncTask3 = Task.Factory.StartNew(() => 
     { 


      for (int ctr = 1; ctr <= 10; ctr++) 

      Console.WriteLine(ctr.ToString() + "3"); 
     }); 


     // syncTask.RunSynchronously(); 


     Console.ReadLine(); 
    } 
} 
+1

Alle diese Aufgaben sind asynchron, und alle von ihnen werden auf einem anderen Thread von Ihrem Hauptthread ausgeführt. Wenn Aufgaben eine Sequenz haben sollen, müssen sie eine Sequenz haben - z. 'erwarten',' ContinueWith'. Schließlich, 'RunSynchronously' macht nicht, was Sie denken, es tut (ich stimme zu, der Name ist verwirrend) - lesen Sie die Dokumentation. – Luaan

+0

Danke Sir, ich möchte nicht Async verwenden und warten, weil ich keine .net Framework-Version benötigt, um zu unterstützen. Auch, weil ich lerne und jede andere Methode kennen lernen möchte. – vic90

+0

Wenn Sie "Aufgabe" haben, haben Sie auch "erwarten". Beide erfordern die gleiche .NET-Version, 'wait' ist nur eine Compiler-Sache - Sie können das Async-Target-Pack verwenden, um auf .NET 4.0" zurück zu warten ". Wenn Sie "warten" (eine sehr schlechte Idee, vor allem wenn Sie nicht wissen, was Sie tun) immer noch vermeiden wollen, ist "ContinueWith" * diese andere Methode - eine native unterstützt in 4.0 und die primäre Methode von Umgang mit asynchronen Workflows bei Aufgaben ohne "Warten". – Luaan

Antwort

0

Es gibt keine synchronen und asynchronen Tasks. Sie können die Aufgabe synchron oder asynchron aufrufen (oder warten), aber die Aufgabe ist dieselbe.

Wenn Sie Aufgabe synchron warten wollen, sollten Sie einfach tun:

Task t = Task.Factory.StartNew(() => 
{ 
    for (int ctr = 1; ctr <= 10; ctr++) 
     Console.WriteLine(ctr.ToString() + "1"); 
}); 

t.Wait(); // waiting task synchronously 

Wenn Sie Aufgabe asynchron warten wollen:

Task t = Task.Factory.StartNew(() => 
{ 
    for (int ctr = 1; ctr <= 10; ctr++) 
     Console.WriteLine(ctr.ToString() + "1"); 
}); 

await t; // waiting task asynchronously 

aber in diesem Fall sollten Sie Ihre Methode als async markieren - (async await usage)

In Ihrem Beispiel - zuerst nach der zweiten und dritten zu warten, sollten Sie tun:

public static void Main() 
{ 
    var syncTask2 = Task.Factory.StartNew(() => 
    { 
     for (int ctr = 1; ctr <= 10; ctr++) 
      Console.WriteLine(ctr.ToString() + "2"); 
    }); 

    syncTask2.Wait();// wait for second task finishing synchronously   

    var syncTask3 = Task.Factory.StartNew(() => 
    { 
     for (int ctr = 1; ctr <= 10; ctr++) 
      Console.WriteLine(ctr.ToString() + "3"); 
    }); 

    syncTask3.Wait(); // wait for third task finishing synchronously after second 

    var syncTask1 = Task.Factory.StartNew(() => 
    { 
     for (int ctr = 1; ctr <= 10; ctr++) 
      Console.WriteLine(ctr.ToString() + "1"); 
    }); 

    syncTask1.Wait(); // wait for third task finishing synchronously after second and third 

    Console.ReadLine(); 
}   
+0

Vielen Dank Sir.Just eine Frage.Task.waitall (synctask2, syncTask3) bedeutet, Pgm wartet auf SyncTask2 und SyncTask3 zu vervollständigen.Aber wie stellt es sicher, SyncTask3 läuft nach SyncTask2? Ist es wegen der Sequenz wir synctask3 nach synctask2 initiiert oder weil wir syncTask3 nach SyncTask2 in Task.waitall geschrieben haben (SyncTask2, syncTAsk3? – vic90

+0

@ vic90, wollen Sie die zweite Aufgabe zuerst, dann dritte und dann zuerst? –

+0

Ja Sir Es wird mir helfen, den Fluss zu verstehen. – vic90

Verwandte Themen