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;
}
这有两个问题:
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来实现这一点