C#通过取消tokensource取消大型操作



我有运行一些数学操作的WPF应用程序。

启动按钮单击时,我计算一些数学,然后返回GUI。

每个操作都有内部的循环。

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

我看到了取消tokensource,我需要通过start方法发送the cancellationTokenSource,然后当用户单击取消取消i取消cancellationTokenSource,在操作上,我需要检查CancellationTokenSource是否取消。

对我有效的是,问题是我需要在代码上进行每个循环(我有一些)检查是否取消comcellationTokenSource,然后我每次都需要返回/投掷异常。

太丑了,如果CancellationTokenSource是取消的,是否有另一种方法可以取消此操作,而无需检查代码吗?

是的,写静态方法:

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 :您只需通过concellationToken而不是整个concellationTokensource。

检查循环中的取消token,尽管丑陋是最好的方法。即使静态方法也可以执行所有工作,然后检查令牌,因此尽管很酷,但我不会建议它。答案没有冒犯,这仍然是一种漂亮的方法。

管理线程,尽管我们已经走了,但在某种程度上仍然是混乱的,这是您无法真正避免的地方之一。您可以发挥创造力并将其清理到仅在循环中简单的呼叫的地步但是有点同样的想法...

我希望我有更好的答案;但是知道你并不孤单。工程师一直在做各种技巧以使其变得更好/更容易/更清洁,但ATM差不多。

最新更新