c# - WP8.1 - CancellationToken 和 async 仍然永远等待并且永远不会结束

标签 c# xaml windows-store-apps windows-phone-8.1 win-universal-app

我有一个非常奇怪的问题,我不知道如何解决。 我在不同的类中有这两种方法。 当按下 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 属性 IsCancellationRequestedbreak 跳出循环。参见 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/

相关文章:

c# - EWS 附加电子邮件在 .Load() 之后缺少 DatatimeReceived 属性

c# - 如何正确格式化 DatePicker StyleTemplate

c# - 无法解析 UWP App 中 System.Runtime 的范围

c# - 从 C# 将文件上传到 Azure 文件时如何更改最大并发值?

c# - 结合 2 个数字成为日期 C#

c# - ListView中的自定义ListViewItem

c# - `FallbackValue` 未在 WPF XAML 中使用空 `Path` 进行绑定(bind)评估?

c# - 如何解析 Windows 应用商店应用程序中的 HTML?

c# - StreamSocket.InputStreamOptions.ReadAsync 在使用 Wait() 时挂起

c# - 除非我引用该项目,否则无法加载 WinRT 组件