Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        /// <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);
        }