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