ユーザーが注文ページで注文の保存をクリックすると、同じ注文を表示しているすべてのユーザーが注文が変更されたという通知を受け取るように、AsyncController を接続しようとしています。これを実装するための私のアプローチは、注文ページで ajax リクエストをロング ポーリングすることですが、これに対処するためにスケーラブルな AsyncController を作成する方法は私には明らかではありません。
これは私がこれまでに持っているものです.IDは、変更された、または変更のためにポーリングされたとして通知される注文のIDです.
public class MessageController : AsyncController
{
static readonly ConcurrentDictionary<int, AutoResetEvent> Events = new ConcurrentDictionary<int, AutoResetEvent>();
public ActionResult Signal(int id)
{
AutoResetEvent @event;
if (Events.TryGetValue(id, out @event))
@event.Set();
return Content("Signal");
}
public void WaitAsync(int id)
{
Events.TryAdd(id, new AutoResetEvent(false));
// TODO: This "works", but I should probably not block this thread.
Events[id].WaitOne();
}
public ActionResult WaitCompleted()
{
return Content("WaitCompleted");
}
}
How to do long-polling AJAX requests in ASP.NET MVC? を見てきました。. このコードに関するすべての詳細を理解しようとしていますが、このコードを理解する限り、スレッドプール内の各ワーカースレッドをブロックしているため、最終的にスレッドの枯渇につながると理解しています。
では、これをスケーラブルな方法で実装するにはどうすればよいでしょうか? サードパーティのコンポーネントをこれ以上使用したくないことに注意してください。このシナリオを適切に実装する方法をよく理解したいと思っています。