2016-05-16 89 views
0

我正在學習線程這些天,並在創建一個同步和異步任務之間感到困惑。我寫了一段代碼,它不起作用。可以有人給我提示這裏有什麼問題。同步任務不工作

我知道這可能是一個簡單的問題,但會真正幫助我獲得這個概念。

我想要什麼 - 同步任務1只應在同步任務2和同步任務3異步後才提供數據。

此外,我想通過任務來做,而不是線程,如果有人可以幫助。

在此先感謝。

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

所有這些任務都是異步的,它們都將在與主線程不同的線程上執行。如果你想要任務有一個序列,讓他們有一個序列 - 例如'await','ContinueWith'。最後,'RunSynchronously'不會做你認爲它的工作(我同意這個名字很混亂) - 閱讀文檔。 – Luaan

+0

謝謝,先生,我不想使用異步,並等待,因爲我沒有要求.NET框架版本支持。此外,其因爲我正在學習,並想知道任何其他方法。 – vic90

+0

如果你有'任務',你也有'等待'。兩者都需要相同的.NET版本,'await'只是一個編譯器的東西 - 您可以使用Async Targetting Pack將「await」「回溯」到.NET 4.0。如果你仍然想避免「await」(一個非常糟糕的主意,特別是當你不知道你在做什麼),ContinueWith' *是另一種方法 - 一個在4.0中本地支持的方法,以及主要的方法在沒有「await」的情況下處理任何異步工作流程。 – Luaan

回答

0

沒有同步和異步任務。您可以同步或異步調用(或等待)任務,但任務是相同的。

如果你想同步等任務,你應該簡單地做:

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

t.Wait(); // waiting task synchronously 

如果要異步等待任務:

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

await t; // waiting task asynchronously 

但在這種情況下,你應該標記您的方法async - (async await usage

在你的例子中 - 等待第二和第三後,你應該這樣做:

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

非常感謝Sir.Just one question.Task.waitall(synctask2,syncTask3)表示Pgm等待syncTask2和SyncTask3完成。但它如何確保syncTask3在syncTask2之後運行?是因爲我們在synctask2之後啓動了synctask3,或者因爲我們在Task.waitall中的SyncTask2之後寫入了syncTask3(SyncTask2,syncTAsk3? – vic90

+0

@ vic90,您希望第二個任務先完成,然後是第三個,然後再完成第一個任務?) –

+0

Yes Sir 。它會幫助我理解流程。 – vic90