等待异步方法而不阻塞线程

时间:2013-06-18 09:39:54

标签: c# wpf asynchronous .net-4.5 async-await

如何在UpdateTasklist()方法之后执行SubmitWorkitem()方法而不阻塞线程?

private async void SubmitWorkitem(Workitem workitem)
{
    await Task.Run(() => this.SubmitWorkitem(workitem));

    //UpdateTasklist() should be executed after SubmitWorkitem() method.
    //How can i achieve this without blocking the UI thread?
    var locator = new ViewModelLocator();
    locator.Task.UpdateTasklist();
}

修改

UpdateTasklist()方法连接到wcf webservice并要求所有打开的工作项。在SubmitWorkitem()方法中提交的工作项仍然是答复的一部分。我认为那是因为UpdateTasklist()在提交工作项目之前执行。

请注意,UpdateTasklist()也是异步方法

1 个答案:

答案 0 :(得分:5)

重要提示:不要写ASYNC VOID方法(除非您正在编写事件处理程序)

其余的:

这已经是您的代码中发生的事情;这就是await 的含义;基本上,您的DifferentClass.UpdateTasklist();方法是作为延续的一部分发生的,该延续时被调用,并且只有当第一个任务(this.SubmitWorkitem(workitem))完成时才会被调用。

通过编辑, 缺少一步:你应该await第二种方法,否则方法无法报告完成/失败(IIRC编译器也会唠叨你):< / p>

private async Task SubmitWorkitem(Workitem workitem)
{
    await Task.Run(() => this.SubmitWorkitem(workitem));
    var locator = new ViewModelLocator();
    await locator.Task.UpdateTasklist();
}