为了账号安全,请及时绑定邮箱和手机立即绑定

任务和异步等待所需的指导

任务和异步等待所需的指导

C#
海绵宝宝撒 2021-07-13 13:30:49
在浏览了大量文章和视频后,我仍然遇到异步编程的问题。我正在开发一个项目,在服务层中,我将所有方法创建为异步。所有返回Task <T>或Task(我确保不返回无效)。现在到这个问题。我的 Api 调用异步方法,这些方法在内部调用其他异步方法,这些方法甚至可能调用其他异步方法。所以每次遇到异步方法我都会等待。我认为,这种方法的缺点是,每次遇到异步时我都在等待结果,这将花费很多时间。例如:public async Task<xyz> DoMainTask(int ActionId, int ItemId, int UserId){   await DoTask1(ActionId,ItemId,UserId);  3 sec   await DoTask2(ActionId,ItemId,UserId);  3 sec   await DoTask3(ActionId,ItemId,UserId);  3 sec}所以我不想等待 9 秒,因为这里的所有任务都是相互独立的。我想做类似的事情:public async Task<xyz> DoMainTask(int ActionId, int ItemId, int UserId){   List<Task> lst = new List<Task>();   t1= DoTask1(ActionId,ItemId,UserId);     lst.Add(t1);   t2 = DoTask2(ActionId,ItemId,UserId);   lst.Add(t2);   t3 = DoTask3(ActionId,ItemId,UserId);   lst.Add(t3);   await Task.WhenAll(lst);   // do some work   return xyz;}这可能需要大约 5-6 秒。我该怎么做呢?每当我尝试使用第二种方法时,它都会出错:在上一个异步操作完成之前,在此上下文中启动了第二个操作DoTask1 定义为:  public async Task DoTask1 (int ActionId, int ItemId, int UserId)    {        try        {            DailyActivityPoint dailyActivityPoint = new DailyActivityPoint()            {                ActionId = ActionId,                CreatedDate = DateTime.Now,                ItemId = ItemId,                UserId = UserId,                PointsAccumulated = await GetPointsAwardedForAction(ActionId)            };            _entities.DailyActivityPoints.Add(dailyActivityPoint);            await _entities.SaveChangesAsync();        }        catch (Exception ex)        {        }    }在 DoTask1 中,我还调用了一个异步方法。如何做到这一点,最佳做法是什么?
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信