【问题标题】:Why does CancellationTokenSource.Cancel cause my UI to lock up for a few seconds? [closed]为什么 CancellationTokenSource.Cancel 会导致我的 UI 锁定几秒钟? [关闭]
【发布时间】:2017-08-08 16:57:26
【问题描述】:

我正在 vb.net 中编写一个 winforms 应用程序(尽管 C# 答案也可以接受。)

我正在尝试取消对Await Stream.CopyToAsync()的呼叫

请看下面我大大简化的代码:

Private _CTS As New Threading.CancellationTokenSource

Private Async Sub DBToFile(ByVal Path As String)
    Dim DBStream as stream = GetDBStream()
    Dim FStream As FileStream = File.Create(Path)
    Await DBstream.CopyToAsync(FStream, 81920, _CTS.Token)
End Sub

当我从我的 UI 调用 _CTS.Cancel() 时,它会导致它冻结几秒钟。为什么会这样?即使我使用Task.Run(Sub() _CTS.Cancel()) 调用它,也没有什么区别。

如果我将令牌与对 Await DBstream.CopyToAsync(FStream, 81920, _CTS.Token) 的调用分离(例如,只调用 Await DBstream.CopyToAsync(FStream)),则不会发生冻结(即使仍在调用 .Cancel()

任何关于我做错了什么的建议都将不胜感激。

【问题讨论】:

  • 您是否能够弄清楚(例如,通过一些跟踪)它是否挂在对.Cancel() 的调用中(所以调用需要很长时间,(这会令人惊讶))还是由于什么在你调用它之后发生。

标签: c# vb.net winforms asynchronous


【解决方案1】:

感谢@tinudu 的建议,我想我可能已经缩小了范围。

似乎冻结发生在调用 Await Stream.CopyToAsync() 之后,而不是在调用期间。

我没有考虑到这一点,因为在调用 Await Stream.CopyToAsync() 之后没有发生任何事情,除了它被包裹在许多 Using 块中,所以有一些处理处理。我只能假设这是原因。

这也可以解释为什么在单独的任务中调用 _CTS.Cancel() 没有帮助,因为我假设 Await Stream.CopyToAsync() 之后的代码在原始线程上继续。

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多