Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 使用Async/Await和EntityFramework调用多个存储过程_C#_Entity Framework_Stored Procedures_Asynchronous_Async Await - Fatal编程技术网

C# 使用Async/Await和EntityFramework调用多个存储过程

C# 使用Async/Await和EntityFramework调用多个存储过程,c#,entity-framework,stored-procedures,asynchronous,async-await,C#,Entity Framework,Stored Procedures,Asynchronous,Async Await,我必须调用多个占用时间的存储过程。理想情况下,这些过程必须同时执行,但这会带来很多问题 以下是简化代码: private async void refresh_Controle(object sender, RoutedEventArgs e) { SqlParameter param1 = new SqlParameter("@devicename", DeviceName); Task<int> mcResult = GenkaiBase.Database.Ex

我必须调用多个占用时间的存储过程。理想情况下,这些过程必须同时执行,但这会带来很多问题

以下是简化代码:

private  async void refresh_Controle(object sender, RoutedEventArgs e)
{
    SqlParameter param1 = new SqlParameter("@devicename", DeviceName);
    Task<int> mcResult = GenkaiBase.Database.ExecuteSqlCommandAsync("exec Refresh_McAfee @devicename", param1);
    int Mc = await mcResult;

    SqlParameter param2 = new SqlParameter("@devicename", DeviceName);

    Task<int> dcaiResult = GenkaiBase.Database.ExecuteSqlCommandAsync("exec Refresh_DCAI @devicename", param2);
    int Dc = await dcaiResult;
}
private async void refresh\u Controle(对象发送方、路由目标方)
{
SqlParameter param1=新的SqlParameter(“@devicename”,devicename);
Task mcResult=GenkaiBase.Database.ExecuteSqlCommandAsync(“exec Refresh\u McAfee@devicename”,param1);
int Mc=等待mcResult;
SqlParameter param2=新的SqlParameter(“@devicename”,devicename);
Task dcaiResult=GenkaiBase.Database.ExecuteSqlCommandAsync(“exec Refresh_DCAI@devicename”,param2);
int Dc=等待dcaiResult;
}
这有两个问题:

  • 这些过程一个接一个地执行
  • 如果我多次调用此函数,就会出现SQL Server错误,其中一个过程被选为牺牲品
  • 我尝试用异步方法使用以下代码同时调用这两个过程:

    public async Task<bool> Refresh_Control(string devicename)
    {
        List<Task> Tlist = new List<Task>();
        Console.WriteLine("Launch Refresh");
    
        SqlParameter param1 = new SqlParameter("@devicename", devicename);
    
        Task<int> mcResult =  Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_McAfee @devicename", param1);
    
        SqlParameter param2 = new SqlParameter("@devicename", devicename);
    
        Task<int> dcaiResult =  Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_DCAI @devicename", param2);
    
        Console.WriteLine("all set");
    
        Tlist.Add(mcResult);
        Tlist.Add(dcaiResult);
    
        await Task.WhenAll(Tlist.ToArray());
        int mc = await mcResult;
        int dc = await dcaiResult;
    
        Console.WriteLine("Finish Refresh" + mc + dc);
        return true;
    }
    
    公共异步任务刷新\u控件(字符串devicename)
    {
    List Tlist=新列表();
    Console.WriteLine(“启动刷新”);
    SqlParameter param1=新的SqlParameter(“@devicename”,devicename);
    Task mcResult=Genkai_db.Database.ExecuteSqlCommandAsync(“exec Refresh_McAfee@devicename”,param1);
    SqlParameter param2=新的SqlParameter(“@devicename”,devicename);
    Task dcaiResult=Genkai_db.Database.ExecuteSqlCommandAsync(“exec Refresh_DCAI@devicename”,param2);
    控制台写入线(“全部设置”);
    Tlist.Add(mcResult);
    t列表添加(dcaiResult);
    等待Task.WhenAll(Tlist.ToArray());
    int mc=等待mcResult;
    int dc=等待dcaiResult;
    控制台写入线(“完成刷新”+mc+dc);
    返回true;
    }
    
    对于同步发送,逻辑很好,但第二个过程抛出错误,因为第一个过程尚未完成

    goole翻译的错误:

    EntityFramework.dll中发生“System.NotSupportedException”类型的异常,但未在用户代码中处理

    其他信息:在此上下文中启动了第二个操作 在上一个异步操作完成之前。使用 “等待”以确保所有异步操作都已完成 在此上下文中调用另一个方法之前。未创建任何成员实例 保证线程安全


    那么,这是怎么回事,为什么我不能同时调用多个存储过程而不被SQL Server卡住呢?

    Update

    我相信EF在这个时候根本不支持这一点,也许这是一个重复的问题。这是不可能做到的。。。对不起

    原创

    问题是您试图等待他们两次。当您将它们传递到
    等待任务中时。当所有
    函数同时运行并等待时。然后,您将再次尝试等待它们,而不是访问任务实例的
    .Result

    请尝试下面的代码,让我知道它是否有效

    public async Task Refresh_Control(string devicename)
    {
        Task<int> mcResult = 
            Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_McAfee @devicename", 
                new SqlParameter("@devicename", devicename));
        Task<int> dcaiResult = 
            Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_DCAI @devicename", 
                new SqlParameter("@devicename", devicename));
    
        await Task.WhenAll(mcResult, dcaiResult);
    
        int mc = mcResult.Result;
        int dc = dcaiResult.Result;
    
        Console.WriteLine("Finish Refresh :: mc=" + mc + ", dc=" + dc);
    }
    
    公共异步任务刷新\u控件(字符串devicename)
    {
    任务mcResult=
    Genkai_db.Database.ExecuteSqlCommandAsync(“exec Refresh_McAfee@devicename”,
    新的SqlParameter(“@devicename”,devicename));
    任务dcaiResult=
    Genkai_db.Database.ExecuteSqlCommandAsync(“exec Refresh_DCAI@devicename”,
    新的SqlParameter(“@devicename”,devicename));
    等待任务。WhenAll(mcResult,dcaiResult);
    int mc=mcResult.Result;
    int dc=dcaiResult.Result;
    Console.WriteLine(“完成刷新::mc=“+mc+”,dc=“+dc”);
    }
    
    它引发的错误与第二个示例的错误相同,第二个示例的起始行为Task dcaiResult=。(请参阅主帖子中的错误)。cmd已启动,我必须等待执行第二个命令???wait不运行任务,它等待已运行的任务。在Task.WhenAll为hin时,两个任务都已在运行。是,并且错误不在执行第二个过程的行的wait its right上。它的以太EF或SQL server拒绝执行。但我怀疑它对此没有解决办法。@David你确认它的EF限制,是不是意味着我可以与比方说ADO并行?我知道这也会引起sql问题,但如果我必须处理死锁,而不是这个限制,那么最好使用ADO。@bryknaval,这就是问题的症状所在——因为当EF检测到您正在并行尝试两个调用时,异步调用将抛出。entity framework您不能,您可以使用多个上下文,但我想您可以使用普通的ADO.NET来实现这一点