【问题标题】:Cannot apply Await and Async properly in C#5.0无法在 C#5.0 中正确应用 Await 和 Async
【发布时间】:2012-06-23 17:47:11
【问题描述】:

我有以下程序可以将文件从一个目录移动到另一个目录。以同步的方式,它工作得很好。但我想以异步的方式来做。

谢谢

【问题讨论】:

    标签: c# async-await c#-5.0


    【解决方案1】:

    错误说明了一切:你不能awaitvoid。你只能awaitTasks 和看起来类似于Tasks 的东西(例如YieldAwaitable,由Task.Yield() 返回)。但是你肯定不能awaitvoid

    似乎没有办法在 .Net 4.5 中异步移动文件。

    您可以做的最好的事情是使用await Task.Run(() => fileinfo.MoveTo(target)) 之类的东西,它仍然会阻塞线程,但不会阻塞当前线程(如果您在 UI 线程上可能会很有用)。

    或者,您也可以使用Streams(可以是异步的)自己复制文件,然后删除原始文件。

    【讨论】:

    • 您好,您的建议有效,但控件没有返回,因此 MessageBox.Show("文件复制成功") 永远不会被调用..怎么办?
    • 这很难说,你试过调试代码看看实际发生了什么吗?当您移动文件时,您的应用程序是否有响应?如果不是,则可能表明您在某处遇到了死锁(例如,您在 Task 完成之前调用了 Wait()Result)。
    【解决方案2】:

    只有当你调用的方法支持时,你才能使用 await。

    要支持await,该方法需要返回一个Task<T>

    在这种情况下,fileInfo.MoveTo 不会返回 Task

    【讨论】:

    • 你可以await 不是Tasks 的东西。参见例如Task.Yield() 不返回 Task,但仍然可以是 awaited。
    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2019-05-29
    • 2013-08-14
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多