Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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#使用CancellationTokenSource取消大操作_C#_Wpf_Events_Cancellationtokensource_Cancel Button - Fatal编程技术网

c#使用CancellationTokenSource取消大操作

c#使用CancellationTokenSource取消大操作,c#,wpf,events,cancellationtokensource,cancel-button,C#,Wpf,Events,Cancellationtokensource,Cancel Button,我有运行一些数学运算的wpf应用程序 当开始按钮单击时,我计算一些数学,并将值返回到Gui 每个操作内部都有一些循环 我想给用户取消点击,立即停止所有的计算 我看到CancellationTokenSource,我需要通过Start方法发送CancellationTokenSource,然后当用户单击Cancel时,我取消CancellationTokenSource,在操作中我需要检查CancellationTokenSource是否为Cancel 这对我来说是可行的,问题是我需要在代码的每个

我有运行一些数学运算的wpf应用程序

当开始按钮单击时,我计算一些数学,并将值返回到Gui

每个操作内部都有一些循环

我想给用户取消点击,立即停止所有的计算

我看到CancellationTokenSource,我需要通过Start方法发送CancellationTokenSource,然后当用户单击Cancel时,我取消CancellationTokenSource,在操作中我需要检查CancellationTokenSource是否为Cancel

这对我来说是可行的,问题是我需要在代码的每个循环中(我有一些)检查cancellationTokenSource是否为cancel,然后每次都需要返回/抛出异常


这太难看了,如果cancellationTokenSource为cancel,是否有其他方法可以取消此操作而无需在代码期间检查大量时间?

是,写入静态方法:

public static Cycles
{
    public static While(Func<bool> condition, Action body, CancellationToken token)
    {
        while(!token.IsCancellationRequested && condition())
        {
            body();    
        }
    }
}
这相当于:

while(!cts.Token.IsCancellationRequested && true)
{
    Console.Write('.');
}

PS:您可以只传递CancellationToken,而不是整个CancellationTokenSource。

检查循环中的CancellationToken,尽管很难看,但这是最好的方法。即使是静态方法也会执行所有工作,然后检查令牌,所以尽管它很酷,但我不建议这样做。我无意冒犯你,这仍然是一个很好的方法

管理线程,虽然我们已经走过了一段路,但在某种程度上仍然是混乱的,这是您不能真正避免的地方之一。你可以有创意,把它清理干净,在循环中做一个简单的调用,为你触发工作,这样它就不会那么难看,你可以使这个方法静态,我相信这比前面的答案更符合逻辑,但有点相同的想法


我希望我能给你一个更好的答案;但我知道你并不孤单。工程师们一直在做各种各样的把戏,使它变得更好/更容易/更干净,但ATM的清洁程度几乎与它得到的一样。

调用你的方法比不使用它的版本要复杂得多。你能解释更多吗?我不明白你的意思。。当单击开始按钮时,我有30个循环,如果我得到取消,我会进行每个循环检查,您的代码如何帮助我,并模仿地打破所有循环(无论何时我的代码是)?谢谢你@你能举个例子吗?我也不明白你的意思。@eocron只是认为按钮应用循环,然后更多的循环…(20-30个循环),一些循环应用更多的循环,所以我需要在每个循环中检查是否取消这不是答案。为您的案例提供完整的解释性示例,这样,如果其他人来了,他们将看到良好的Q/A,而不是一堆关于“思考”的注释。使用CancellationToken.ThrowifcCancellationRequested而不是检查cancelled标志可能会使您的代码不那么难看
while(!cts.Token.IsCancellationRequested && true)
{
    Console.Write('.');
}