2017-07-28 136 views
-1

我創建了一個任務併爲task.wait()方法提供了等待時間,但是任務沒有等到所提供的時間,並且在等待時間之前返回完成狀態爲false。任務沒有等到等待時間

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

class Test 
{ 
    static void Main(string[] args) 
    { 
     for(int i = 0 ; i < 10 ; i++) 
     { 
      int localValue = i; 
      Task.Factory.StartNew(() => ProcessTask(localValue)); 
     } 
     Console.ReadKey(); 
    } 

    private static void ProcessTask(int thread) 
    { 
     var task = Task<int>.Factory.StartNew(() => GetSomeValue()); 
     task.Wait(2000); 

     if(task.IsCompleted) 
     { 
      Console.WriteLine("Completed Thread: " + thread); 
     } 
     else 
     { 
      Console.WriteLine("Not Completed Thread " + thread); 
     } 
    } 

    private static int GetSomeValue() 
    { 
     Thread.Sleep(400); 
     return 5; 
    } 
} 

更新:

我已經更新了代碼。當我運行這個代碼時,我得到了以下輸出。

enter image description here

只有兩個任務都完成了的10,所以我想知道什麼是與此代碼的問題?

注:我在4.5.2框架中運行此代碼。

+4

假如你試圖給'Tuple '變量賦一個'int'值,它看起來並不像代碼甚至會編譯。請提供[mcve]。 (我也建議使用'Task.Run'而不是'TaskFactory.StartNew' ...) –

+0

@ JonSkeet-由於錯誤的Tuple被添加。我更新了代碼。而我正在使用4.0框架,所以運行該方法不可用。 – Girish

+0

這些信息值得一提,因爲這幾天需要4.0是多麼罕見......而且你還沒有發佈[mcve],這會讓你更容易幫助你。 –

回答

1

如果您需要等待任務完成,您可以使用屬性結果。 Result屬性阻塞調用線程直到任務完成。

var task = Task<int>.Factory.StartNew(() => GetsomeValue()); int res = task.Result;

+0

我在Result部分使用Result屬性。如果任務完成,那麼我使用任務的結果,否則我執行其他語句。 – Girish

+0

看起來OP最多等了2秒鐘。這是一件完全合理的事情,並建議無條件地阻止不符合他們的用例。 –

3

的問題不在於Task.Wait不等待足夠長的時間在這裏 - 那就是你假設只要你撥打Task.Factory.StartNew()(你應該幾乎不這麼做,順便說一句 - use Task.Run instead)任務開始。事實並非如此。任務調度是一個複雜的話題,我不認爲是專家,但是當你同時開始很多任務時,線程池會在創建一個新線程之前等待一段時間,看看它是否可以重用它。

如果您向代碼添加更多日誌記錄,則可以看到此內容。我在Wait呼叫之前和之後以及Sleep呼叫之前和之後添加了日誌記錄,確定涉及到哪個原始值i。 (我按照慣例調用線程,但事實並非如此)。日誌使用DateTime.UtcNow,並使用MM:ss.FFF的模式顯示時間戳,時間戳爲毫秒。

這裏是日誌的輸出單個任務完成:

12:01.657: Before Wait in thread 7 
12:03.219: Task for thread 7 started 
12:03.623: Task for thread 7 completing 
12:03.625: After Wait in thread 7 

這裏Wait調用返回小於2秒後,但因爲任務已經完成這很好。

而這裏的日誌輸出單個任務沒有完成:

12:01.644: Before Wait in thread 6 
12:03.412: Task for thread 6 started 
12:03.649: After Wait in thread 6 
12:03.836: Task for thread 6 completing 

這裏Wait真的等待2秒,但仍然任務還沒有完成,因爲它只有在Wait時間到來之前才正確啓動只需