protected virtual void OnAsyncMessageFailed(AsyncMessageFailedEventArgs e) { if (e == null) { throw new ArgumentNullException("e"); } var threadSafeHandler = Interlocked.CompareExchange(ref AsyncMessageFailed, null, null); if (threadSafeHandler != null) { threadSafeHandler(this, e); } }
public void RaiseAsync(InteractionMessage message) { if (message == null) { throw new ArgumentException("messageはnullにできません"); } if (!message.IsFrozen) { message.Freeze(); } var task = Task.Factory.StartNew(() => Raise(message), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); task.ContinueWith(t => { var e = new AsyncMessageFailedEventArgs(t.Exception); OnAsyncMessageFailed(e); t.Exception.Handle(ex => true); }, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); }
/// <summary> /// 指定された、戻り値情報のある相互作用メッセージを非同期で送信します。 /// </summary> /// <typeparam name="T">戻り値情報のある相互作用メッセージの型</typeparam> /// <param name="message">戻り値情報のある相互作用メッセージ</param> /// <param name="callback">コールバック</param> public void GetResponseAsync <T>(T message, Action <T> callback) where T : ResponsiveInteractionMessage { if (message == null) { throw new ArgumentException("messageはnullにできません"); } if (!message.IsFrozen) { message.Freeze(); } var task = Task <T> .Factory.StartNew(() => GetResponse(message)); task.ContinueWith(t => { var e = new AsyncMessageFailedEventArgs(t.Exception); OnAsyncMessageFailed(e); t.Exception.Handle(ex => true); }, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); task.ContinueWith(t => callback(t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); }