我必須調用多個消耗時間的存儲過程。理想情況下,這些程序必須在同一時間執行,但會引發很多問題。使用Async/Await和EntityFramework調用多個存儲過程
下面是簡化代碼:
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;
}
這有2個問題:
- 這些程序等
- 如果我叫其再次,我得到一個SQL後執行一個服務器錯誤,其中一個過程被選爲受害者。
我打過電話在同一時間兩個程序使用此代碼在異步方法:
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但在用戶代碼
附加信息沒有被處理的:第二操作在前面的異步操作完成之前,在此背景下啓動了 。使用 「等待」以確保在調用此上下文中的另一個方法之前完成所有異步操作 。沒有成員實例是 保證是線程安全的。
那麼,爲什麼我不能同時調用多個存儲過程而不被SQL Server卡住呢?
實體框架,你不能,你可以有多個方面,但我想你可以用正常的ADO.NET – brykneval