我有一个非常奇怪的问题,我不知道如何解决。 我在不同的类中有这两种方法。 当按下 CommandBar 中的按钮时触发第一个。
编辑:我创建了两个类似但更小的方法来向您展示问题:
private async void runCode(object sender, RoutedEventArgs e)
{
BottomAppBar.IsEnabled = false;
object result = await endlessLoopTest();
BottomAppBar.IsEnabled = true;
}
private async Task<object> endlessLoopTest()
{
var tokenSource = new System.Threading.CancellationTokenSource(500);
try
{
await Task.Run(() =>
{
while (true)
{
//Infinite loop to test the code
}
}, tokenSource.Token);
return null;
}
catch (OperationCanceledException)
{
return new TextBlock();
}
}
我添加了一个在 1500 毫秒后过期的 cancellationToken(我假设如果解释器需要更长的时间来处理代码,它就会陷入循环)。
我第一次尝试它通常有效,但如果我再试一次,CommandBar 按钮将永远不会再次启用,所以我假设该任务一直在等待,我不知道为什么,因为我添加了 cancellationToken .
你知道这里可能出什么问题吗? 感谢您的帮助!
塞尔吉奥
最佳答案
您已经完成了大约 2/3 的路程。使用 CancellationToken
+ CancellationTokenSournce
时,必须询问 token 是否已取消。有多种订阅方式,包括调用 token 的 ThrowIfCancelledRequest。方法或检查 token 的 Boolean
属性 IsCancellationRequested并 break
跳出循环。参见 Cancellation in Managed Threads .
这是一个可以在控制台应用程序中运行的小示例。请注意,在基于 UI 的应用程序中,使用 await
,而不是 Task.Wait()
。
private static void CancelTask()
{
CancellationTokenSource cts = new CancellationTokenSource(750);
Task.Run(() =>
{
int count = 0;
while (true)
{
Thread.Sleep(250);
Console.WriteLine(count++);
if (cts.Token.IsCancellationRequested)
{
break;
}
}
}, cts.Token).Wait();
}
结果是 0 1 2
然后任务和程序退出。
关于c# - WP8.1 - CancellationToken 和 async 仍然永远等待并且永远不会结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792711/