2013-05-27 75 views
-1

我試圖用Task.Factory開始一個新的任務,但它什麼都不做,因爲它只是移動到下一行代碼並且不執行任何任務。這裏是代碼:Task.Factory.StartNew沒有做任何事

for(int i = 0; i < alts.Length; i++) { 
    String password = alts [i].Substring (alts[i].IndexOf(":")+1); 
    String username = alts [i].Substring (0,alts[i].IndexOf(":")); 

    Console.WriteLine ("Loaded account: "+ username); 
    Task.Factory.StartNew(() => connectUser(username, password, server)); 
} 
+0

您是如何檢測到「它什麼都不做,因爲它只是移動到下一行代碼並且不執行任何任務」? –

回答

1

您應該使用await關鍵字來等待任務完成。只要把await在該行的開頭:

Task.Factory.StartNew(() => connectUser(username, password, server)); 

此外,你必須在函數的返回值類型前添加關鍵字async

更新(更多信息): Task.Factory.StartNew創建一個任務,啓動並返回給你。當你不使用await你不等待它完成。這有助於您想要開始一堆任務並讓它們同時運行的情況。

private static void connectUser(string username, string password, string server) 
    { 
     while (true) 
     { 
      Console.WriteLine("Connecting... " + username); 
      Thread.Sleep(500); 
     } 
    } 

    static void Main(string[] args) 
    { 
     var server = "a.com"; 
     var alts = new string[] { "abc:abc", "bcd:bcd" }; 

     var tasks = new Task[alts.Length]; 

     for (int i = 0; i < alts.Length; i++) 
     { 
      String password = alts[i].Substring(alts[i].IndexOf(":") + 1); 
      String username = alts[i].Substring(0, alts[i].IndexOf(":")); 

      Console.WriteLine("Loaded account: " + username); 
      tasks[i] = Task.Factory.StartNew(() => connectUser(username, password, server)); 
     } 

     Task.WaitAll(tasks); 
    } 

這就是我以前的建議。您創建一個Task s的數組,並將Task.Factory.StartNew()的結果放入該數組中。然後使用Task.WaitAll()函數等待任務完成。另一種方法是使用線程。順便說一下,我建議你使用大寫字母作爲函數名,意思是:ConnectUser而不是connectUser

+0

它不會繼續循環並啓動其他「任務」,因爲connectUser方法最終會變成無限循環。 – user1947236

+0

我對你想要的東西有點困惑。如果要運行所有任務並等待它們完成,請捕獲返回的任務並使用['WaitAll'](http://msdn.microsoft.com/zh-cn/library/dd270695.aspx) –

+0

如果您想要逐個完成它們,請使用'await'關鍵字 –

0

根據您的意見,問題是任務在後臺線程的線程池線程上運行。只有前臺線程保持進程運行,所以一旦Main退出程序結束。您可能最好是手動創建線程並將IsBackground設置爲false以保持程序正常運行。