1

情報表示として機能するWebページに表示されるメッセージのリアルタイム配信(現時点ではMSMQを使用)のフレームワークを構築しようとしています。メッセージがキューに到着したらすぐに、メッセージをページに表示したいと思います。

コントローラ:

public class MessageController : AsyncController
{
    public void IndexAsync()
    {
        AsyncManager.OutstandingOperations.Increment(1);
        Task<string>.Factory.StartNew(() =>
            {
                var queue = new MessageQueue(@".\private$\path-to-queue");
                while (true)
                {
                    var message = string.Empty;
                    var result = queue.BeginReceive();
                    queue.Formatter = new XmlMessageFormatter(new[] {typeof (string)});
                    queue.ReceiveCompleted += delegate(object sender, ReceiveCompletedEventArgs args) { message = args.Message.Body.ToString(); };
                    queue.EndReceive(result);
                    return message;
                }
            }).ContinueWith(t =>
                {
                    AsyncManager.Parameters["message"] = t.Result;
                    AsyncManager.OutstandingOperations.Decrement();
                }
            );
    }

    public JsonResult IndexCompleted(string message)
    {
        return Json(message, JsonRequestBehavior.AllowGet);
    }
}

ブラウザからアクションを呼び出すと、ブラウザはメッセージがキューに表示されるのを待ちます。メッセージをキューに追加すると、ブラウザはリクエストを続行しますが、メッセージの内容ではなく空白の文字列が表示されます。

代わりに、私は置き換えてみました

message = args.Message.Body.ToString();

デリゲート内で

return args.Message.Body.ToString();

しかし、戻り値の型が void であることを示すコンパイラ エラーが発生しました。

確かに、私はデリゲートにはまだ慣れていませんが、正しい方向へのプッシュに大いに感謝しています。

ありがとう -


編集 2012 年 11 月 25 日 @ 22:29

私は実用的な解決策にたどり着きました...それが最良の方法であるかどうかはわかりません。そのため、ピアレビューのためにこれを開いたままにしています.

public class MessageController : AsyncController
{
    public void IndexAsync()
    {
        AsyncManager.OutstandingOperations.Increment(1);
        Task<Message>.Factory.StartNew(() =>
            {
                var queue = new MessageQueue(@".\private$\path-to-queue");
                while (true)
                {
                    var result = queue.BeginReceive();
                    queue.Formatter = new XmlMessageFormatter(new[] {typeof (string)});
                    var message = queue.EndReceive(result);
                    return message;
                }
            }).ContinueWith(t =>
                {
                    AsyncManager.Parameters["message"] = t.Result.Body.ToString();
                    AsyncManager.OutstandingOperations.Decrement();
                }
            );
    }

    public JsonResult IndexCompleted(string message)
    {
        return Json(message, JsonRequestBehavior.AllowGet);
    }
}
4

1 に答える 1