C# Ronaly等待它完成(不阻塞UI线程)
但是,如果使方法C# Ronaly等待它完成(不阻塞UI线程),c#,.net,asynchronous,.net-4.5,async-await,C#,.net,Asynchronous,.net 4.5,Async Await,但是,如果使方法异步无效,则无法等待操作完成。当该方法返回时,您知道异步操作已启动,但仅此而已 您需要做的是更改Archive()以返回任务,以便在事件处理程序中等待任务完成。任务将自动返回,您不需要(或可以)添加任何返回s 因此,将Archive()的签名更改为: private async Task Archive(string file, string destination, DateTime taken) 然后在事件处理程序中等待它(您还需要将其更改为async): 通常,async
异步无效
,则无法等待操作完成。当该方法返回时,您知道异步操作已启动,但仅此而已
您需要做的是更改Archive()
以返回任务
,以便在事件处理程序中等待任务完成。任务
将自动返回,您不需要(或可以)添加任何返回
s
因此,将Archive()
的签名更改为:
private async Task Archive(string file, string destination, DateTime taken)
然后在事件处理程序中等待它(您还需要将其更改为async
):
通常,
async void
方法应仅用于事件处理程序。所有其他的async
方法都应该是async Task
(或者async Task
,如果它们返回一些值的话),这样你就可以等待它们。我不是.Net 4.5新的async/await特性的专家,但有一件事让我觉得非常突出,那就是你唯一异步运行的东西就是文件副本。我相信,在更好的指导下,您会得到一些有用的答案。@DanielKelley您还希望异步运行什么?@svick根据您的答案-存档中的所有内容。除了wait
ingfs.CopyToAsync
之外,其他一切都占用了UI线程。@DanielKelley仍然如此,即使您wait
等待Archive()的结果。
。但是:1。这不应该是个问题,我在那里看不到长时间的操作。2.这些操作没有异步版本。@svick可能我的评论措词不当-我不是说每个操作都应该使用异步方法执行(例如文件删除)。我的意思是他在等待文件副本,而不是调用存档
——由于方法的签名不正确,他无法这样做。你不能等待
一个异步无效
方法。我试过了,但等待抛出错误“void is not waitable”。我想这就是我对任务缺乏理解的原因。存档方法需要返回任务吗?但目的何在?Cheers@James对于该错误,很抱歉,返回类型必须是Task
,才能“等待”。您是否忘记更新Archive
的签名?(+1来自我,这是一个很好的清晰解释)@DanielKelley是的,我做了。谢谢,现在修好了。很好的解释,现在就测试一下。我认为可能需要周末阅读来更好地理解任务可以做什么。非常好。现在做我所期望的。非常感谢你。
private async Task Archive(string file, string destination, DateTime taken)
private async void btnSort_Click(object sender, RoutedEventArgs e)
{
// snip
foreach (string f in result)
{
DateTime dest = GetDateTakenFromImage(f);
await Archive(f, Destination, dest);
}
}