我需要调用多个耗时的存储过程。理想情况下,这些存储过程应该同时执行,但这会引发很多问题。
以下是简化后的代码:
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;
}
以下有两个问题:
- 这些过程一个接一个地执行。
- 如果我调用这个过程超过一次,我会得到一个 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;
}
虽然逻辑上可以同时发送,但第二个过程抛出了一个错误,因为第一个过程还没有完成。
谷歌翻译的错误信息:
'System.NotSupportedException' 类型的异常在 EntityFramework.dll 中发生,但未在用户代码中处理
其他信息:在上一个异步操作完成之前,在此上下文中启动了第二个操作。使用 "await" 确保在调用此上下文中的另一个方法之前已完成所有异步操作。不能保证任何成员实例是线程安全的。
那么问题在哪里?为什么我不能调用多个存储过程而不被 SQL Server 卡住呢?