Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C异步等待的Rest调用和数据库保存不起作用_C#_.net_Async Await_Task Parallel Library_Task - Fatal编程技术网

C# 使用C异步等待的Rest调用和数据库保存不起作用

C# 使用C异步等待的Rest调用和数据库保存不起作用,c#,.net,async-await,task-parallel-library,task,C#,.net,Async Await,Task Parallel Library,Task,我有一个案例,我将进行rest调用,并根据响应将其保存到数据库中 private async Task<bool> ProcessParallal<T>(IList<T> t,PropertyInfo pi, string name, int Id) { string mainId = null,intermediateId = null; var tasks = t.Select(async item => {

我有一个案例,我将进行rest调用,并根据响应将其保存到数据库中

private async Task<bool> ProcessParallal<T>(IList<T> t,PropertyInfo pi, string name, int Id)
{
    string mainId = null,intermediateId = null;

    var tasks = t.Select(async item =>
    {
        var response = await CallRestApi(item,(long)(pi.GetValue(item)),name,id);

        //Saving Rsult based on RestAPi result
        // Requiremnt is wait until databse operation finishes
        await this.SaveToTable(response.id,name,id));

    });
    await Task.WhenAll(tasks);

    return await Task.FromResult(false);
}

private async Task<string> SaveToTable(int responseId,name,id)
{
    //Save details in Audit Table 
    _iDataAccess.AuditSave(responseId,name,id);
    return await Task.FromResult("Success");
}

public async Task<ResponseResult> CallRestApi<T>(T itemObj,id,name)
{
    //Fetching From DB
    var info = await fetchDetailsFromDB(id, name);
   //Rest Api Call
   return await CreateNewEntryByRestCall<T>(itemObj,info.name);
}
但ProcessParallal不会等到数据库操作完成,即SaveToTable方法。ProcessParallal方法在数据库操作完成之前返回


有人能指出这段代码的问题吗?

如果我理解了您在等待ProcessParallal方法时提出的问题,您的异步调用

然后应更改为同步调用:

private bool ProcessParallal<T>(IList<T> t,PropertyInfo pi, string name, int Id)

如果我理解了您在等待ProcessParallal方法时提出的问题,那么您的异步调用

然后应更改为同步调用:

private bool ProcessParallal<T>(IList<T> t,PropertyInfo pi, string name, int Id)

在Select的末尾放置.ToList时会发生什么情况?i、 e.var tasks=t.Selectasync item=>..ToList@发展有什么不同吗。。我将测试..无法复制此问题。您确定ProcessParallal在SaveToTable方法完成之前返回吗?。。您可以再次验证,可能是您可以在数据库操作完成之前放置一些日志..ProcessParallal方法返回-这是通过设计异步等待方法实现的。当执行到达带有wait的行时,如果返回的任务实例未完成,则执行返回给ProcessParallal方法的调用方。任务完成后,从等待行继续执行。在您的情况下,这是在执行命中line Wait Task时发生的;我认为您需要更具体地描述您的问题,并告诉我们不等待数据库操作完成是什么意思,以及您如何检查它不等待。那么,_iDataAccess.AuditSave sync还是async方法?您可以编辑答案以显示其声明。将.ToList放在Select的末尾会发生什么情况?i、 e.var tasks=t.Selectasync item=>..ToList@发展有什么不同吗。。我将测试..无法复制此问题。您确定ProcessParallal在SaveToTable方法完成之前返回吗?。。您可以再次验证,可能是您可以在数据库操作完成之前放置一些日志..ProcessParallal方法返回-这是通过设计异步等待方法实现的。当执行到达带有wait的行时,如果返回的任务实例未完成,则执行返回给ProcessParallal方法的调用方。任务完成后,从等待行继续执行。在您的情况下,这是在执行命中line Wait Task时发生的;我认为您需要更具体地描述您的问题,并告诉我们不等待数据库操作完成是什么意思,以及您如何检查它不等待。那么,_iDataAccess.AuditSave sync还是async方法?您可以编辑答案以显示其声明。