6

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 đề:

  1. những thủ tục thực hiện một sau khi khác
  2. 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?

+1

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

Trả lời

5

Cập nhật

Tôi tin rằng đây chỉ đơn giản là không được hỗ trợ bởi EF tại thời điểm này, và có lẽ đây là một câu hỏi trùng lặp dựa trên this SO answer. Nó không thể được thực hiện ... Xin lỗi.

gốc

Vấn đề là bạn đang cố gắng await họ hai lần. Khi bạn chuyển chúng vào hàm await Task.WhenAll chúng đang chạy song song và chờ đợi. Sau đó, sau đó bạn đang cố gắng chờ đợi họ một lần nữa, thay vì truy cập vào .Result của cá thể nhiệm vụ.

Vui lòng thử mã bên dưới và cho tôi biết nếu nó hoạt động.

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); 
} 
+0

Nó nâng cao lỗi tương tự so với dụ thứ hai của tôi tại dòng bắt đầu với Task dcaiResult =. (Xem lỗi trong bài chính) .a cmd đã được đưa ra, tôi phải đợi trước khi exec một seconde ??? – Zwan

+0

đang chờ đợi không chạy tác vụ, nó chờ nhiệm vụ đang chạy. Tại thời điểm Task.WhenAll đang ẩn cả hai tác vụ đang chạy. – usr

+0

có và lỗi không phải là trên chờ đợi rigth của nó tại dòng đó thực hiện thủ tục thứ hai. Ether của nó EF hoặc SQL server mà từ chối exec.But tôi nghi ngờ nó không có sửa chữa này. – Zwan

Các vấn đề liên quan