2013-03-22 55 views
1

我有一個函數,使一個新的HTTP請求,並在任務運行。 該函數可以在中間被中斷,因爲我不能中止任務,我在函數中添加了一些布爾條件。 例如:取消功能

public int foo(ref bool cancel) 
{ 
    if(cancel) 
    { 
     return null 
    } 
    //do some work... 
    if(cancel) 
    { 
     return null 
    } 
    //http webrequest 
    if(cancel) 
    { 
     return null 
    } 
} 

thisworked相當不錯的,雖然這是相當一些醜陋的代碼。

另一個問題是,當我已經執行的Web請求,這需要時間,我得到比功能cncelation的反應需要大量的時間(直到我得到迴應)。

有沒有更好的辦法,我檢查這個?或mybe我應該使用線程而不是任務?

編輯

我添加了一個取消令牌:宣佈cancelationTokenSource,並通過它的令牌任務

CancellationTokenSource cncelToken = new CancellationTokenSource(); 
Task t = new Task(() => {foo()},cancelToken.token); 

當我這樣做cancelToken.Cancel(); 我還在等待迴應,而且tsk並未取消。

回答

1

任務支持取消 - 見here

這裏有一個快速片段。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var token = new CancellationTokenSource(); 
     var t = Task.Factory.StartNew(
      o => 
      { 
       while (true) 
        Console.WriteLine("{0}: Processing", DateTime.Now); 
      }, token); 

     token.CancelAfter(1000); 
     t.Wait(token.Token); 
    } 
} 

記得使用提供的取消令牌等待任務。你應該收到一個OperationCanceledException。

+2

什麼奇妙的完整,很好地解釋了答案! – RMalke 2013-03-22 17:52:58

+0

但它與我的解決方案相似。只有我的任務調用一個函數,並且該函數不知道取消令牌。我仍然必須檢查是否要求取消。我可以使用一個cancelation令牌,但是我仍然不得不等待回覆。我想在此之前取消它。 – alostr 2013-03-22 17:54:56

+0

不是真的 - 需要輪詢取消令牌只有當您有一些清理執行。如果沒有任何清理任務將悄悄停止執行您的代碼。 – Ani 2013-03-22 18:27:04