等待功能完成

时间:2014-11-19 09:32:22

标签: c# asynchronous async-await synchronous

在我的一个职能中,我收到了一份文件:

controller.retrieveDocument(documentID);
// here I want to some work after the document has finished loading

这就是函数的构建方式:

public async void retrieveDocument(string documentID){
    DocumentResult documentResult = await GetDocumentTask (documentID);
    // do some checks here
}

被调用函数执行此操作:

private async Task<DocumentResult> GetDocumentTask (string documentID){

    try{
        loadingSpinner.show();
        documentResult = await Task.Run(() => manager.GetDocument (documentID));
        loadingSpinner.hide();
    }
    catch(Exception ex)
    {
        // do something
    }
}

现在我希望如果retrieveDocument已经完成,我还会做其他工作。目前的问题是retrieveDocument是异步的,其他代码在函数加载完成之前执行。我想到了两种选择:

  1. 以某种方式等待retrieveDocument
  2. 全部同步。
  3. retrieveDocument
  4. 中使用单独的活动

    我不知道我应该如何在retrieveDocument上等待1.我试图让它同步,但是加载微调器没有正确显示。它似乎等待webservice调用,如果它已经完成,很快就会显示微调器。但这引入了一种滞后。如果我异步使用它我没有得到这种行为,并正确显示加载微调器。第3号似乎是最好的选择,但其他选项如何运作?

    我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

您要么将您的功能重写为......

public async Task retrieveDocument(string documentID){
    DocumentResult documentResult = await GetDocumentTask (documentID);
    // do some checks here
}

OR

public Task retrieveDocument(string documentID){
    Task<DocumentResult> documentResult = GetDocumentTask (documentID);
    // do some checks here
    return documentResult;
}

但是你很可能想要前者。

您需要返回Task,因为这是包含概念,在飞行中工作以及完成事件的对象。 async await实际上只是非常聪明的语法糖,添加了一些非常酷的库(主要用于错误处理)。