2013-03-22 51 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