在我的一个职能中,我收到了一份文件:
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
是异步的,其他代码在函数加载完成之前执行。我想到了两种选择:
retrieveDocument
。retrieveDocument
我不知道我应该如何在retrieveDocument
上等待1.我试图让它同步,但是加载微调器没有正确显示。它似乎等待webservice调用,如果它已经完成,很快就会显示微调器。但这引入了一种滞后。如果我异步使用它我没有得到这种行为,并正确显示加载微调器。第3号似乎是最好的选择,但其他选项如何运作?
我在这里缺少什么?
答案 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
实际上只是非常聪明的语法糖,添加了一些非常酷的库(主要用于错误处理)。