2015-01-04 72 views
4

這可能是一個奇怪的問題,它確實是爲了我的教育目的,所以我可以將它應用於未來可能出現的場景中。如何確定Task.Run是否在一個循環內完成

我正在使用C#。

我是壓力測試,所以這不是生產代碼。

我通過Web服務將數據上傳到我的服務器。

我使用Run.Task啓動服務。

我在允許下一個Run.Task開始之前檢查是否已完成任務。

這是在一個循環內完成的。

但是,因爲我正在使用模塊化的聲明任務會不會影響結果? 我可以聲明一個本地的Task.Run變量,但我想看看我能在第一個問題中得到多少。

如果Task.Run可以引發事件說它已完成,那麼這可能不是問題?

這是我的代碼:

//模塊聲明:

private static Task webTask = Task.Run(() => { System.Windows.Forms.Application.DoEvents(); }); 

//在通過定時器

if (webTask.IsCompleted) 
{ 
    //keep count of competed tasks 
} 


webTask = Task.Run(() => 
{ 
    try 
    { 
     wcf.UploadMotionDynamicRaw(bytes); //my web service 
    } 
    catch (Exception ex) 
    { 
     //deal with error 
    } 
); 
+1

使用[任務繼續](http://msdn.microsoft.com/en-us/library/ee372288%28v=vs.110%29的.aspx)。有不同的修改。其中之一是*在任務完成後做些事*。國際海事組織你不需要計時器 - 改變你的代碼到'webTask.ContinueWith ...'。 – pasty 2015-01-04 10:20:56

+0

@pasty嗨,謝謝你的反應。我會看看這個,現在並報告 - 謝謝:) – 2015-01-04 10:23:24

+0

@pasty所以,當我修改我的代碼如下: – 2015-01-04 10:26:10

回答

6

調用的函數IMO你不需要計時器。使用Task Continuation訂閱事件:

System.Threading.Tasks.Task 
.Run(() => 
{ 
    // simulate processing 
    for (var i = 0; i < 10; i++) 
    { 
     Console.WriteLine("do something {0}", i + 1); 
    } 
}) 
.ContinueWith(t => Console.WriteLine("done.")); 

輸出是:

do something 1 
do something 2 
. 
. 
do something 9 
do something 10 
done 

您的代碼看起來是這樣的:

var webTask = Task.Run(() => 
{ 
    try 
    { 
     wcf.UploadMotionDynamicRaw(bytes); //my web service 
    } 
    catch (Exception ex) 
    { 
     //deal with error 
    } 
}).ContinueWith(t => taskCounter++); 

隨着任務延續你可以失敗成功處理結果,如果您只想計算成功任務 - 使用TaskContinuationOptrions

+1

嗨,我只是使用計時器進行壓力測試,並完全同意你的看法。 MSDN上的例子與你的不同,我更喜歡你的。更清楚。謝謝 – 2015-01-04 10:31:20

+0

請問downvoter請注意解釋一下? – pasty 2015-01-04 13:22:35

2

可以等待你的任務由等待你的任務是這樣

await webTask; 

將異步等待「webTask」完成完成。您可以使用await Task.Delay而不是定時器,它將異步等待延遲到期。我也會考慮讓wcf調用異步,所以你不必在Task.Run內部調用。有關提示,請參閱this question

我已經重寫了代碼如下:

public async Task UploadAsync() 
{ 
    while(true) 
    { 
     await Task.Delay(1000); // this is essentially your timer 

     // wait for the webTask to complete asynchrnously 
     await webTask; 

     //keep count of competed tasks 

     webTask = Task.Run(() => 
         { 
          try 
          { 
           // consider generating an asynchronous method for this if possible. 
           wcf.UploadMotionDynamicRaw(bytes); //my web service 
          } 
          catch (Exception ex) 
          { 
           //deal with error 
          } 
         });  
    } 
} 
+0

嗨,謝謝你的不同答案。非常感激。我意識到等待,但我想有異步。所有這些的原因是監視Web服務器是否跟上我的重複呼叫。通過監視隊列,我可以(希望)檢測到這一點。 – 2015-01-04 11:06:03

相關問題