Signalr: async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рдорд╛рд░реНрдЪ 2017  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: SignalR/SignalR

рдореИрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкрд╛рдЗрдХ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рд░рд╛ред рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдПрдХ рдмрд╛рд░ рдЬрдм рдЙрд╕рдиреЗ рд╣рдм рдкрд░ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХреА, рддреЛ рдЙрд╕реЗ рдирдП рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХрднреА рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рддреБрд░рдВрдд Subscribe рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдкрд░ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЦреБрд╢реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ _until_ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рд╡рд┐рдзрд┐ .Wait() рдмрдЬрд╛рдп await рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрдВрд╕реЛрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ wpf рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ SynchronizationContext ), рдпрд╛ рд╕реА # рд╕рд┐рдЧреНрдирд▓рдЖрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рд╣реИред

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

await hubProxy.Invoke("Foo"); рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

await hubProxy.Invoke("Foo"); рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рдЬрдирди рдХреЗ рдЪрд░рдг

```рд╕реА#
рдХрдХреНрд╖рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо
{
рд╕реНрдереИрддрд┐рдХ рд╢реВрдиреНрдп рдореБрдЦреНрдп ()
{
рднрд╛рдЧреЛ ()ред рд░реБрдХреЛ ();
}

рд╕реНрдЯреЗрдЯрд┐рдХ рдПрд╕рд┐рдВрдХреНрд╕ рдЯрд╛рд╕реНрдХ рд░рди ()
{
рдХрдВрд╕реЛрд▓.рд░рд╛рдЗрдЯрд▓рд╛рдЗрди ("[рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░] рдПрдВрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдВрдЯрд░ рджрдмрд╛рдПрдВ...");
рдХрдВрд╕реЛрд▓ред рд░реАрдбрд▓рд╛рдЗрди ();

var hubConnection = new HubConnection("http://localhost:39103/");
var hubProxy = hubConnection.CreateHubProxy("MyHub");
hubProxy.On<string>("OnMessage", msg =>
{
  Console.WriteLine($"Received: {msg}");
});

await hubConnection.Start();

// Receiving messages quite happily at this point

Console.WriteLine("And press Enter again to break the application...");
Console.ReadLine();

await hubProxy.Invoke("Foo", "Bar");

// NO MESSAGES FOR YOU!

Console.WriteLine("And press Enter to Exit, because computers...");
Console.ReadLine();

}
}
```

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

e55b89a45618d222e2c37a3b14969923c998899b рдореЗрдВ рдлрд┐рдХреНрд╕реНрдб

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ, рднрд▓реЗ рд╣реА рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдкрд╛рдЗрдХ рд╣реИ, рдЬрд┐рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЗрд╡рд╛ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ ASP.NET рд╡реЗрдм рдПрдкреАрдЖрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде wpf рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рднреА рд▓реА рдЬрд╛рдПрдЧреАред

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдирд┐рд╣рд┐рдд рдЧрддрд┐рд░реЛрдз рд╣реИред рдпрджрд┐ рдЖрдк рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдВрджреЗрд╢ рдЕрднреА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХреЗрд╡рд▓ рдЖрдкрдХрд╛ рдХреЙрд▓рдмреИрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓рд╛ рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ:

And press Enter to Exit, because computers...
16:44:27.6966075 - b8022975-3d42-4935-952d-7c43a392d049 - WS: OnMessage({"C":"d-59F20992-B,18|S,0|T,1","M":[{"H":"ChatHub","M":"broadcastMessage","A":["adfasf","sadf"]}]})
16:44:28.6936798 - b8022975-3d42-4935-952d-7c43a392d049 - WS: OnMessage({})
16:44:31.4080330 - b8022975-3d42-4935-952d-7c43a392d049 - WS: OnMessage({"C":"d-59F20992-B,19|S,0|T,1","M":[{"H":"ChatHub","M":"broadcastMessage","A":["adfasf","adfsa"]}]})
16:44:36.2056851 - b8022975-3d42-4935-952d-7c43a392d049 - OnError(Microsoft.AspNet.SignalR.Client.Infrastructure.SlowCallbackException: Possible deadlock detected. A callback registered with "HubProxy.On" or "Connection.Received" has been executing for at least 10 seconds.)
16:44:38.6935113 - b8022975-3d42-4935-952d-7c43a392d049 - WS: OnMessage({})

рдЕрдкрдиреА рддрд░рдл рд╕реЗ рдЖрдк Console.ReadLine(); рдХреЛ await Console.In.ReadLineAsync() рдмрджрд▓рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореВрд▓ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдЙрд╕реА рдереНрд░реЗрдб рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЯрд╛рд╕реНрдХрдХрдВрдкреНрд▓реАрд╢рдирд╕реЛрд░реНрд╕ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред SetResult( ) рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрд┐рд╕реА рднрд┐рдиреНрди рдереНрд░реЗрдб рдкрд░ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ TCS рдмрдирд╛рддреЗ рд╕рдордп TaskCreationOption.RunContinuationsAsynchronously рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдзрд╛рдЧрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдореЗрд░рд╛ рдПрд╕рд┐рдВрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдиреБрднрд╡ рд╣реИред

e55b89a45618d222e2c37a3b14969923c998899b рдореЗрдВ рдлрд┐рдХреНрд╕реНрдб

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tanaka-takayoshi picture tanaka-takayoshi  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

niravpatel picture niravpatel  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ghost picture ghost  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JoergTiedemann picture JoergTiedemann  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

OfirYemini picture OfirYemini  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ