取消功能

时间:2013-03-22 17:47:17

标签: c# .net c#-4.0 task

我有一个函数可以生成一些http请求,并在一个任务中运行。 该函数可以在中间中断,因为我不能中止任务,我在函数中添加了一些布尔条件。 例如:

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

这个工作非常好,虽然这是一些相当丑陋的代码。

另一个问题是,当我已经执行了Web请求时,我需要时间来获得响应,而不是函数cncelation需要花费很多时间(直到我得到响应)。

我有更好的方法来检查这个吗?或mybe我应该使用线程而不是任务?

修改

我添加了一个取消令牌:声明了一个cancelationTokenSource,并将其令牌传递给任务

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

当我做cancelToken.Cancel(); 我还在等待回应,并且tsk没有取消。

1 个答案:

答案 0 :(得分: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。