相关疑难解决方法(0)

异步一直向下?

试图理解新的异步/等待模式,我有一个问题,我找不到答案,即如果我应该用异步装饰我的方法,如果我打算从其他异步函数调用这些方法,或只是返回Tasks在适当情况下?

换句话说,这些A,B或C类中哪一个最好,为什么?

class A<T>
{
      public async Task<T> foo1() //Should be consumed
      {
          return await foo2();
      }

      public async Task<T> foo2() //Could be consumed
      {
          return await foo3();
      }

      private async Task<T> foo3() //Private
      {
          return await Task.Run(...);
      }
}

class B<T>
{
      public async Task<T> foo1() //Should be consumed
      {
          return await foo2();
      }

      public async Task<T> foo2() //Could be consumed
      {
          return await foo3();
      }

      private Task<T> foo3() //Private
      {
          return Task.Run(...);
      }
}

class C<T> …
Run Code Online (Sandbox Code Playgroud)

c# async-await c#-5.0

16
推荐指数
1
解决办法
1904
查看次数

Async-await - 我在做它吗?

最近我对我在Web API项目中实现async-await模式的方式产生了怀疑.我已经读过async-await应该是"一直",这就是我所做的.但这一切都开始显得多余,我不确定我是否正确地做到了这一点.我有一个调用存储库的控制器,它调用数据访问(实体框架6)类 - "一直异步".我已经阅读了很多相互矛盾的内容,并希望将其清理干净.

编辑:引用的可能重复是一个很好的帖子,但不够具体到我的需要.我提供了代码来说明问题.看来真的很难得到一个决定性的答案.如果我们可以将async-await放在一个地方然后让.net处理其余部分,那就太好了,但我们做不到.那么,我是在做它还是不那么简单.

这是我得到的:

控制器:

public async Task<IHttpActionResult> GetMessages()
{
    var result = await _messageRepository.GetMessagesAsync().ConfigureAwait(false);
    return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)

库:

public async Task<List<string>> GetMessagesAsync()    
{
    return await _referralMessageData.GetMessagesAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

数据:

public async Task<List<string>> GetMessagesAsync()
{           
    return await _context.Messages.Select(i => i.Message).ToListAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

c# async-await asp.net-web-api

10
推荐指数
2
解决办法
1189
查看次数

在循环内部,使用task的continuewith将每个异步调用链接到返回的任务吗?

最好的做法是收集async循环内集合中的所有调用并执行Task.WhenAll().但是,想要了解await在循环中遇到的情况会发生什么,返回Task包含什么?那些进一步的async电话呢?它会创建新任务并将它们添加到已经返回的Task顺序中吗?

根据下面的代码

private void CallLoopAsync()
{
   var loopReturnedTask = LoopAsync();
}

private async Task LoopAsync()
{
    int count = 0;
    while(count < 5)
    {
       await SomeNetworkCallAsync();
       count++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设的步骤是

  1. LoopAsync 被叫
  2. count 设置为零,代码进入while循环,条件被检查
  3. SomeNetworkCallAsync 被调用,等待返回的任务
  4. 创建新任务/等待
  5. 新任务返回到CallLoopAsync()

现在,如果有足够的时间让流程生存,那么下一个代码行将如何/以何种方式执行count++并进一步SomeNetworkCallAsync执行?

更新 - 基于Jon HannaStephen Cleary:

因此,有一个任务,该任务的实现将涉及5次对NetworkCallAsync的调用,但使用状态机意味着这些任务不需要明确地链接以使其工作.例如,这允许它根据任务的结果决定是否中断循环,等等.

虽然它们没有链接,但每次调用都会等待前一个调用完成,因为我们已经使用了await(在状态m/c中awaiter.GetResult();).它的行为就好像连续五年已吁请他们执行一前一后另一个(仅后,以前的呼叫被完成).如果这是真的,我们必须更加小心我们如何组成异步调用.对于ex:

而不是写作

private async Task …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous async-await

5
推荐指数
1
解决办法
1081
查看次数

标签 统计

async-await ×3

c# ×3

asp.net-web-api ×1

asynchronous ×1

c#-5.0 ×1