循环内异步

时间:2020-09-14 08:56:22

标签: c# asynchronous async-await

我尝试测试此结构,但它永远无法正常工作。
我相信我误会了它,或者缺乏并发知识。

请照亮我正确的方向。

我调用一个save方法,但这永远不会保存。

我的代码:

public async Task<MyObject> GetMyObject_ById(int id)
{
    var responseDto = await this.RestApi.QueryMyObject_ById(id).ConfigureAwait(false);

    if (responseDto != null)
    {
       return this.mapper.Map<MyObject>(responseDto);
    }
    else
    {
       return null;
    }
}

public async Task<MyObject> UpdateMyObject(int id, MyObject updatevalue)
{
    var dto = this.mapper.Map<MyObjectDto>(updatevalue);

    var updateinfo = await this.RestApi.Update(id, dto).ConfigureAwait(false);

    return this.mapper.Map<MyObject>(updateinfo);
}


private void Save()
{    
    foreach (MyObject pb in this.ListToSave)
    {
         this.SaveValue(pb.Id, pb.Status));
    }
}

private async Task<MyObject> SaveValue(int id,string status)
{
     var info = this.GetMyObject_ById(id).Result;

     info.Status = status;

     return await this.RestApi.UpdateMyObject(id, info).ConfigureAwait(false);
}

1 个答案:

答案 0 :(得分:3)

只是总结评论。您应该替换this.GetMyObject_ById(id).Result;await this.GetMyObject_ById(id);一起使用以避免阻塞。应该避免使用.Result.Wait(),因为它们可能导致死锁。

您可能希望您的保存方法如下所示:

private async void Save()
{
    try
    {    
         foreach (MyObject pb in this.ListToSave)
        {
             await this.SaveValue(pb.Id, pb.Status));
        }
     }
     catch(Exception e){ 
     // handle exception
     }
}

private async Task Save()
{    
    foreach (MyObject pb in this.ListToSave)
    {
         await this.SaveValue(pb.Id, pb.Status));
    }
}

使用异步方法时,即使结果可能是异常,也应该始终采用某种方法来处理结果。这也将在上一个操作完成后执行每个保存调用,这通常不是一个坏主意,因为它有助于避免线程问题。