我有运行一些数学运算的wpf应用程序。
当“开始”按钮单击时,我会计算一些数学,并将值返回给Gui。
每个操作都有一些循环。
我想给用户取消点击即可立即停止所有计算。
我看到了CancellationTokenSource,我需要通过Start方法发送cancellationTokenSource,然后当用户点击取消时取消cancelTokenSource,并且在操作中我需要检查cancelTokenSource是否被取消。
对我来说,问题是我需要在我的代码中放入每个循环(我有一些)检查cancelTokenSource是否取消,然后我需要每次都返回/抛出异常。
太难看了,如果cancelTokenSource被取消,还有其他方法可以在代码中检查很多时间来取消此操作吗?
答案 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就像它一样干净。