【问题标题】:Async Await Calls not processing one of the calls异步等待调用未处理其中一个调用
【发布时间】:2014-06-15 15:08:41
【问题描述】:

我有 2 个并行调用,nCallAsync 调用数据库 SP 在表 A 中进行一些插入, vCallAsync 调用 Web 服务并将数据记录在表 A 中。 之后,我从表 A 中读取数据。但是在我的代码中,我可以看到 nCallAsync 在表 A 读取之前在分析器中执行,但是没有来自 nCallAsync 的数据,唯一获取数据的方法是如果我一起停止其他任务

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;
}

【问题讨论】:

  • 可以在nCallAsync内分享代码吗?
  • Logdata会调用私有方法调用存储过程

标签: c# asp.net-mvc-4 asynchronous async-await c#-5.0


【解决方案1】:

您的async 方法中没有await。您应该会看到一个编译器警告,告诉您确切的信息。因为没有await,所以没有异步;您有一个完全同步的方法,它恰好将其结果包装在 Task 中。

这里有两个常规选项。

  1. 将您正在执行的实际 IO 从同步 IO 更改为异步 IO。可以修改 Web 服务代码以生成任务返回方法,而不是在 IO 发生时阻塞的方法。然后,您可以 await 那些 IO 方法,而不是让您的 async 方法调用阻塞 IO。

  2. 只需让您的整个应用程序同步即可。去掉 nCallAsync 上的 async(并删除 Async 后缀)。然后只需使用Task.Run 调用该方法即可在另一个线程中执行该操作。此选项几乎没有那么可取,因为您有一个线程池线程无所事事,只等待异步操作,但如果实际使用完全异步 IO 不可能或不可行,有时您必须求助于此.

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 2020-05-24
    • 2018-01-02
    • 1970-01-01
    • 2019-02-12
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多