我尝试测试此结构,但它永远无法正常工作。
我相信我误会了它,或者缺乏并发知识。
请照亮我正确的方向。
我调用一个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);
}
答案 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));
}
}
使用异步方法时,即使结果可能是异常,也应该始终采用某种方法来处理结果。这也将在上一个操作完成后执行每个保存调用,这通常不是一个坏主意,因为它有助于避免线程问题。