private void ResolveTransport(IConnection connection, string data, TaskCompletionSource <object> tcs, int index) { // Pick the current transport IClientTransport transport = _transports[index]; transport.Start(connection, data).ContinueWith(task => { if (task.IsFaulted) { // Make sure we observe the exception var ex = task.Exception; #if !WINDOWS_PHONE && !SILVERLIGHT && !NETFX_CORE Trace.TraceError("SignalR exception thrown by Task: {0}", ex); #endif #if NET35 Debug.WriteLine(System.String.Format(System.Globalization.CultureInfo.InvariantCulture, "Auto: Failed to connect to using transport {0}", (object)transport.GetType().Name)); #else Debug.WriteLine("Auto: Failed to connect to using transport {0}", (object)transport.GetType().Name); #endif // If that transport fails to initialize then fallback var next = index + 1; if (next < _transports.Length) { // Try the next transport ResolveTransport(connection, data, tcs, next); } else { // If there's nothing else to try then just fail tcs.SetException(task.Exception); } } else { // Set the active transport _transport = transport; // Complete the process tcs.SetResult(null); } }); }