情報表示として機能する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);
}
}