-1

純粹出於實驗的原因,我想寫使用Task S IN C#任務的執行順序,而不是同時

我有2個任務,和2個靜態變量glo_aglo_count一個僞隨機數生成器。 glo_a應該保存最終結果(一個7位隨機二進制整數)。

public static int glo_a = 0, glo_count = 6; 

Private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    Task task = new Task(() => this.display(1)); 
    Task task2 = new Task(() => this.display(0)); 

    task.Start(); 
    task2.Start(); 

    Task.WaitAll(); 
    textBox1.AppendText("\n" + glo_a); 
} 

public void display(int j) 
{ 
    for (; glo_count >= 0; glo_count--) 
    { 
    glo_a += j * (int)Math.Pow(10,glo_count); 
    } 
} 

private void refreshbutton_Click(object sender, RoutedEventArgs e) 
{ 
    /* reset the original values*/ 
    glo_a = 0; 
    glo_count = 6; 
    textBox1.Text = ""; 
} 

我遇到的問題是,task先執行並完成task2開始每一次之前。

+0

要完成的任務很少,這並不奇怪。 – 2011-05-06 06:56:55

回答

3

由於任務已經很少做機會,他們最終會運行一前一後,因爲你開始TASK1第一,這可能會首先運行。

正如其他答案所述,只需使用Random類。

2

我能問你爲什麼不只是產生「位」使用此:

Random r = new Random(); 
r.Next(2); 

或更好:

Random r = new Random(); 
byte[] randomBytes = new byte[7]; 
r.NextBytes(randomBytes); 

在任何情況下,假設你有一個奇怪的要求做你在做什麼,你確定他們正在順序運行嗎?

我想說在第二個任務有機會開始之前,第一個任務結束的可能性更大。

在任何情況下,這將是同樣的事情,但你可以嘗試:

Task.WaitAll(
    new Task(() => this.display(1)), 
    new Task(() => this.display(0)) 
); 

如果你不顧一切地使用自己的東西,你可以做一個隨機生成,以決定哪一個任務首先啓動:

Random r = new Random(); 

Task task = new Task(() => this.display(1)); 
Task task2 = new Task(() => this.display(0)); 
Task[] tasks = new [] { task, task2 }; 

/* Only supports 2 tasks */ 
int firstTask = r.Next(2); 

tasks[firstTask].Start(); 
tasks[firstTask^1].Start(); 

Task.WaitAll(); 
+0

這只是一個學習的東西。基本上目標不是產生隨機數。我想了解TPL的功能。但TPL由於共享靜態變量(我猜)將任務調度到順序執行。有什麼方法可以同時執行它們嗎? (我有一個i5處理器,所以uniprocessing不是問題;)) – Sagar 2011-05-06 07:02:30

+1

我會說這不是順序執行,這是事實上,第一個任務太小,處理速度太快,或至少總是在第二個任務之前。僅僅因爲它們是異步的(即同時運行)並不意味着它們必然以不確定的順序開始。如果我們同時在一條賽道上跑,但是你首先出發,那麼即使我們同時在跑,也可以每次都先結束。我已經提供了一個關於如何切換哪個任務首先啓動的更新,但顯然這會破壞目的。 – 2011-05-06 07:06:01

+0

恩......謝謝。但正如我所說,我的目標不是隨機數字生成...我想了解tpl是如何工作的......但我認爲你的第一個任務在第二個開始之前就結束了...而我認爲睡眠將解決它:) – Sagar 2011-05-06 07:32:11