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