【发布时间】: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