Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 取消函数_C#_.net_C# 4.0_Task - Fatal编程技术网

C# 取消函数

C# 取消函数,c#,.net,c#-4.0,task,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(

我有一个函数,可以发出一些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所需的时间要长(直到得到响应为止)

有没有更好的方法让我检查一下?或者我应该使用线程而不是任务

编辑

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

CancellationTokenSource cncelToken = new CancellationTokenSource();
Task t = new Task(() => {foo()},cancelToken.token);
当我执行cancelToken.Cancel()时;
我仍在等待响应,tsk没有取消。

任务支持取消-请参阅

这里有一个简短的片段

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。

任务支持取消-请参阅

这里有一个简短的片段

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。

但它与我的解决方案类似。唯一的问题是我的任务调用了一个函数,而该函数不知道取消令牌。我还要检查一下是否有人要求取消。我可以使用CNCELIONG代币,但我仍需等待回复。我想在那之前取消它。不是真的-只有当你有一些清理要执行时,才需要对取消令牌进行轮询。如果没有任何清理,任务将自动停止执行您的代码。我编辑了问题,尝试使用取消令牌@AnanthonlineHanks真是太棒了!现在我遇到了另一个问题,我不能重复使用这个任务。当我尝试使用new Task()时,任务仍处于已取消状态。当我使用task.factory.startnew()时,它可以创建新任务,但任务的状态仍然相同@Ananthonline好了,我玩了一会儿,找到了答案。我所需要做的就是处理这个任务,但它抛出了异常,因为它还没有取消,所以我只是循环了一下,等待取消生效,然后处理了这个任务。tanks@ananthonline你帮了我很多!!但这与我的解决方案类似。唯一的问题是我的任务调用了一个函数,而该函数不知道取消令牌。我还要检查一下是否有人要求取消。我可以使用CNCELIONG代币,但我仍需等待回复。我想在那之前取消它。不是真的-只有当你有一些清理要执行时,才需要对取消令牌进行轮询。如果没有任何清理,任务将自动停止执行您的代码。我编辑了问题,尝试使用取消令牌@AnanthonlineHanks真是太棒了!现在我遇到了另一个问题,我不能重复使用这个任务。当我尝试使用new Task()时,任务仍处于已取消状态。当我使用task.factory.startnew()时,它可以创建新任务,但任务的状态仍然相同@Ananthonline好了,我玩了一会儿,找到了答案。我所需要做的就是处理这个任务,但它抛出了异常,因为它还没有取消,所以我只是循环了一下,等待取消生效,然后处理了这个任务。tanks@ananthonline你帮了我很多!!