private async Task DispatchInvocationAsync(InvocationMessage invocation) { // Make sure we get off the main event loop before we dispatch into user code await AwaitableThreadPool.Yield(); // Find the handler if (!_handlers.TryGetValue(invocation.Target, out var invocationHandlerList)) { Log.MissingHandler(_logger, invocation.Target); return; } // Grabbing the current handlers var copiedHandlers = invocationHandlerList.GetHandlers(); foreach (var handler in copiedHandlers) { try { await handler.InvokeAsync(invocation.Arguments); } catch (Exception ex) { Log.ErrorInvokingClientSideMethod(_logger, invocation.Target, ex); } } }
private async Task ExecuteApplication(SocketDelegate socketDelegate, ConnectionContext connection) { // Jump onto the thread pool thread so blocking user code doesn't block the setup of the // connection and transport await AwaitableThreadPool.Yield(); // Running this in an async method turns sync exceptions into async ones await socketDelegate(connection); }
private async Task RunClosedEvent(Func <Exception, Task> closed, Exception closeException) { // Dispatch to the thread pool before we invoke the user callback await AwaitableThreadPool.Yield(); try { Log.InvokingClosedEventHandler(_logger); await closed.Invoke(closeException); } catch (Exception ex) { Log.ErrorDuringClosedEvent(_logger, ex); } }
private async Task ExecuteApplication(ConnectionDelegate connectionDelegate, HttpConnectionContext connection) { // Verify some initialization invariants // We want to be positive that the IConnectionInherentKeepAliveFeature is initialized before invoking the application, if the long polling transport is in use. Debug.Assert(connection.TransportType != HttpTransportType.None, "Transport has not been initialized yet"); Debug.Assert(connection.TransportType != HttpTransportType.LongPolling || connection.Features.Get <IConnectionInherentKeepAliveFeature>() != null, "Long-polling transport is in use but IConnectionInherentKeepAliveFeature as not configured"); // Jump onto the thread pool thread so blocking user code doesn't block the setup of the // connection and transport await AwaitableThreadPool.Yield(); // Running this in an async method turns sync exceptions into async ones await connectionDelegate(connection); }