我有2个并行调用,nCallAsync调用数据库SP在表A中做一些插入, vCallAsync调用Web服务并在表A中记录数据。 之后,我从表A中读取数据。但是在我的代码中,我可以看到在表A读取之前在探查器中执行nCallAsync,但是没有来自nCallAsync的数据,只有获取数据的方法是,如果我一起停止其他任务< / p>
Task<int> nCTask = nCallAsync();
Task<int> vCTask = vCallAsync();
int n = await nCTask;
int v = await vCTask;
我对这种行为感到困惑
非常感谢任何帮助
async Task<int> nCallAsync()
{
int i = 0;
i = Logdata(this.Id, this.var1, var2);
return i;
}
答案 0 :(得分:6)
您的async
方法中没有await
。您应该看到编译器警告您确切地告诉您。因为没有await
,所以没有异步;你有一个完全同步的方法,恰好将其结果包装在Task
。
这里有两个常规选项。
将您正在执行的实际IO从同步IO更改为异步IO。可以修改Web服务代码以生成任务返回方法,而不是在IO发生时阻塞的方法。然后,您可以await
这些IO方法,而不是让您的async
方法调用阻止IO。
只需让整个应用程序同步即可。摆脱async
上的nCallAsync
(并移除Async
后缀)。然后使用Task.Run
调用该方法以在另一个线程中执行操作。这个选项几乎没有那么好,因为你有一个线程池线程只是在等待异步操作,但是如果实际使用完全异步的IO是不可能或不可行的,有时你不得不求助于此。