Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ronaly等待它完成(不阻塞UI线程)_C#_.net_Asynchronous_.net 4.5_Async Await - Fatal编程技术网

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
ing
fs.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);
    }
}