Tôi phải gọi nhiều thủ tục được lưu trữ để tiêu tốn thời gian. Lý tưởng nhất là các thủ tục đó phải thực hiện cùng một lúc nhưng nó làm tăng rất nhiều vấn đề.Gọi nhiều thủ tục đã lưu bằng cách sử dụng Async/Await và EntityFramework
Đây là mã đơn giản:
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;
}
này có 2 vấn đề:
- những thủ tục thực hiện một sau khi khác
- nếu tôi gọi này nhiều lần, tôi nhận được một lệnh SQL Lỗi máy chủ trong đó một trong các thủ tục được chọn làm nạn nhân.
tôi đã cố gắng kêu gọi hai thủ tục trong thời gian tương tự với mã này trong một phương pháp async:
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;
}
Logic là tốt cho gửi điều đồng thời nhưng các thủ tục thứ hai ném ra một lỗi gây ra cái đầu tiên chưa kết thúc.
Lỗi dịch bằng goole:
Một ngoại lệ của loại 'System.NotSupportedException' xảy ra ở EntityFramework.dll nhưng không được xử lý theo mã người dùng
Thông tin bổ sung: Một ca mổ thứ hai đã được bắt đầu trong bối cảnh này trước khi một hoạt động không đồng bộ trước đó đã được hoàn thành. Sử dụng "đang chờ" để đảm bảo rằng tất cả các hoạt động không đồng bộ được hoàn thành trước khi gọi một phương thức khác trong ngữ cảnh này. Không có cá thể thành viên nào được giữ nguyên là .
Vì vậy, thỏa thuận là gì, tại sao tôi không thể gọi một số quy trình được lưu trữ cùng một lúc mà không bị máy chủ SQL mắc kẹt?
khuôn khổ thực thể bạn không thể, bạn có thể với nhiều bối cảnh, nhưng tôi đoán bạn có thể làm điều này với ADO.NET bình thường – brykneval