2014-12-15 19 views
7

Tôi có Dịch vụ Windows .NET (máy khách) đang liên lạc với Trung tâm SignalR (máy chủ). Hầu hết các phương pháp khách hàng sẽ mất thời gian để hoàn thành. Khi nhận được cuộc gọi từ máy chủ, làm thế nào để tôi (hoặc tôi cần phải) bọc phương pháp/hub mục tiêu. Để tránh cảnh báo:Cách sử dụng async/await với hub.On trong ứng dụng SignalR

"Vì cuộc gọi này không được chờ đợi, thực hiện phương pháp hiện tại . tiếp tục trước khi cuộc gọi được hoàn thành xem xét áp dụng các nhà điều hành đang chờ đợi đến kết quả của cuộc gọi"

trên client, đây là một mẫu của các khởi động mã/thiết lập:

IHubProxy _hub 
string hubUrl = @"http://localhost/"; 

var connection = new HubConnection(hubUrl, hubParams); 
_hub = connection.CreateHubProxy("MyHub"); 
await connection.Start(); 

_hub.On<Message>("SendMessageToClient", i => OnMessageFromServer(i.Id, i.Message)); 
_hub.On<Command>("SendCommandToClient", i => OnCommandFromServer(i.Id, i.Command)); 

Cũng trong ngày khách hàng, đây là mẫu của các phương pháp:

public static async Task<bool> OnMessageFromServer(string Id, string message) 
{ 
    try 
    { 
     var result = await processMessage(message); //long running task 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("There was an error processing the message: ", ex); 
    } 
    return result; 
} 

public static async Task<bool> OnCommandFromServer(string Id, string command) 
{ 
    try 
    { 
     var result = await processCommand(command); //long running task 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("There was an error processing the message: ", ex); 
    } 
    return result; 
} 

Cuối cùng, tôi nghĩ _hub.On đang đăng ký gọi lại, chứ không phải thực thi thực tế (gọi) từ máy chủ. Tôi nghĩ rằng tôi cần phải nhận được ở giữa thực hiện thực tế, chờ đợi kết quả của On [X] FromServer và trả lại kết quả.

************* cập nhật ví dụ với mã sửa *********************

IHubProxy _hub 
string hubUrl = @"http://localhost/"; 

var connection = new HubConnection(hubUrl, hubParams); 
_hub = connection.CreateHubProxy("MyHub"); 
await connection.Start(); 

//original 
//_hub.On<Message>("SendMessageToClient", i => OnMessageFromServer(i.Id, i.Message)); 
//_hub.On<Command>("SendCommandToClient", i => OnCommandFromServer(i.Id, i.Command)); 

//new async 
_hub.On<Message>("SendMessageToClient", 
    async (i) => await OnMessageFromServer(i.Id, i.Message)); 

_hub.On<Message>("SendCommandToClient", 
    async (i) => await OnCommandFromServer(i.Id, i.Message)); 

//expanding to multiple parameters 
_hub.On<Message, List<Message>, bool, int>("SendComplexParamsToClient", 
    async (p1, p2, p3, p4) => 
     await OnComplexParamsFromServer(p1.Id, p1.Message, p2, p3, p4));  

Và sau đó chữ ký phương thức đích sẽ là một cái gì đó như

public static async Task<bool> OnComplexParamsFromServer(string id, string message, 
       List<Message> incommingMessages, bool eatMessages, int repeat) 
{ 
    try 
    { 
     var result = await processCommand(message); //long running task 
     if (result) 
     { 
      // eat up your incoming parameters 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("There was an error processing the message: ", ex); 
    } 
    return result; 
} 

Nhờ @AgentFire để có phản hồi nhanh chóng !!!

+2

Đó là khuyến cáo không nên sử dụng '.Wait();' nhưng 'chờ connection.Start()' để thay thế. – AgentFire

+0

Cảm ơn lời khuyên ... Tôi đã cập nhật mã để phản ánh cho người đọc trong tương lai. –

Trả lời

6

Đây là một mô hình trống-awaitable, sử dụng nó như thế này:

_hub.On<Message>("SendMessageToClient", async i => await OnMessageFromServer(i.Id, i.Message)) 
+0

Cảm ơn bạn đã trả lời !!! Từ góc nhìn dễ đọc, "void-awaitable" trả về một bool? Từ mã, nó không giống như nó trả về bất cứ điều gì. Có cách nào tốt hơn để đăng ký gọi lại có thể rõ ràng hơn đối với các nhà phát triển khác đang xem mã của tôi không? Hay điều này rõ ràng dồi dào đối với các nhà phát triển thực sự và không rõ ràng với một người mới như tôi? :-) –

+2

Có, phương pháp async-void khá nổi tiếng với mọi người. Có ba loại phương pháp async và ... bạn nên tìm hiểu về toàn bộ sự việc. Sẽ không làm tổn thương bạn:] – AgentFire

+1

Câu trả lời của bạn là tài nguyên duy nhất trên internet cho thuật ngữ * void-awaitable *. Tôi cũng không hiểu những gì * async void * đã làm với điều này, ngoài * async void * được khuyến khích cao. – Stijn

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