2017-03-06 14 views
0

私はFBのように通知機能を行う必要があります。誰かが新しいオブジェクトをシステムに追加した場合、「新しいオブジェクトがTomによって追加されました」のように、すべてのユーザーに通知テーブルのエントリを追加したいと思います。メッセージ。しかし、パフォーマンスには影響しません。FBのように通知ログを作成する方法は?

は、トムはシステムに新しいオブジェクトを追加しようとして考えてみましょう:

  1. トムは
  2. 今すぐ場合詳細はDB
  3. に渡されるオブジェクトオブジェクト詳細に
  4. 保存オブジェクトの詳細を追加しますそれは正常に保存され、トムへの成功メッセージを表示しなければならず、 と並行して通知エントリをすべてのユーザに送る必要があります。 はTomの応答に影響しません。なぜなら、トムは まで完全に通知するまで待つ必要がないからです。

あなたはこの問題を解決するためにあなたのアイデアをお勧めしますか?

注:私はasyn操作で試行しました。しかし場合によってはうまくいきません。 Asyncは、そのプロセスが完了するまで完全に動作します。あなたがあなたの要求をブロックすることなくバックグラウンドタスクを実行しているようないくつかのことを実現したい場合は

+0

「_Iがで試行を持ってSignalrを使用することができ、すべてのユーザー間での通知を送信します。まだ実行されているこれらのように、IISは、突然、あなたのワーカープロセスを終了doesntのasynの操作ですが、場合によっては動作しませんあなたが問題があればチェックできるように、通知を非同期で作成しているコードを含めてください。 SignalRの提案は –

答えて

1

することは、あなたが応答を送信している限り後であっても、バックグラウンドタスクとして、あなたのコードを実行System.Web.Hostingに以下を使用する必要があるかもしれません

HostingEnvironment.QueueBackgroundWorkItem(cancellationToken => 
{ 
    // your code here that puts the entry in Notification table 
}); 

をしかし、あなたの目的はにある場合にのみ、あなたは(https://www.asp.net/signalr

+1

+1です。しかし、IO操作(データベース)である通知を作成するには、バックグラウンドワーカースレッドを作成するのではなく、非同期操作(** IO専用操作用に特別に設計された**)を使用する方がよいと思います。 –

+0

バックグラウンドワーカースレッド_ **を作成する代わりに**非同期操作(IO固有の操作用に特別に設計されたもの)を使用しました** **つまり、このシナリオでは非同期のスレッドはほとんど作成されません。 –

+2

async/awaitを使用すると、親スレッドはブロックされませんが、親スレッド(要求)が終了すると、すべての子非同期スレッドが停止します(つまり、クライアントに応答が生成された場合)。私はLTAravindhがこの問題に直面していると思います。つまり、非同期操作はバックグラウンドタスクとは呼ばれません。これらは並列タスクです。バックグラウンドにするためには、バックグラウンドで応答が生成された後でも動作するQueueBackgroundWorkItemを使用する必要があります。 –

関連する問題