c#使用CancellationTokenSource取消大操作

时间:2017-12-26 21:58:39

标签: c# wpf events cancellationtokensource cancel-button

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

当“开始”按钮单击时,我会计算一些数学,并将值返回给Gui。

每个操作都有一些循环。

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

我看到了CancellationTokenSource,我需要通过Start方法发送cancellationTokenSource,然后当用户点击取消时取消cancelTokenSource,并且在操作中我需要检查cancelTokenSource是否被取消。

对我来说,问题是我需要在我的代码中放入每个循环(我有一些)检查cancelTokenSource是否取消,然后我需要每次都返回/抛出异常。

太难看了,如果cancelTokenSource被取消,还有其他方法可以在代码中检查很多时间来取消此操作吗?

2 个答案:

答案 0 :(得分:-1)

是的,写静态方法:

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

然后使用它:

var cts = new CancellationTokenSource();
Cycles.While(()=> true, 
             ()=>
             {
                 Console.Write('.');
             }, 
             cts.Token);

...

cts.Cancel(); //called in another thread

这非常精确地等同于:

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

PS :您只需传递CancellationToken而不是整个CancellationTokenSource。

答案 1 :(得分:-1)

检查循环中的CancellationToken虽然很难看,但却是最好的方法。即使是静态方法也会执行所有工作,然后检查令牌,所以虽然它很酷,但我不会建议它。没有冒犯的答案,它仍然是一个漂亮的方法。

管理线程虽然我们已经遇到过,但在某种程度上仍然很混乱,这是你无法避免的地方之一。你可以创造性地清理它,直到在循环中进行一个简单的调用,这将触发你的工作,这样它就不会那么丑,你可以让那个方法变得静态,我相信这比早期的答案更合乎逻辑但是有点同样的想法......

我希望我有更好的答案;但是知道你并不孤单。工程师们已经做了各种各样的技巧,以使其变得更好/更容易/更清洁,但ATM就像它一样干净。