3

私は現在、多くのクライアント アプリケーションが短いメッセージを送信する TCP リスナーを作成しています。私が持っている TCP リスナーは C# の winform であり、これらのログをバッチで処理して、キューで受信するすべてのメッセージでデータベースにヒットしないようにする必要があります。現在、リスナーで受信するすべてのメッセージで、C# キュー クラスを使用してエンキューを実行しています。

別のスレッドが 5 分ごとに実行され、このキューをチェックし、キューに入れられたアイテムがある場合はキューの処理を開始します。この設計には同時実行/競合状態の問題があるようです。5 分間のスレッドが開始されると、受信される新しいメッセージは、DeQueue 中にロックされているため、Queue にアクセスできなくなります。したがって、これらの新しいメッセージは失われます。TCP リスナーに大量のメッセージが送信されている場合にのみ発生しているようです。

これは私の側の設計に欠陥があると思う人はいますか、それとももっと良い解決策があるでしょうか? メッセージを送信しているクライアント アプリケーションからの制限に基づいて、MSMQ または WCF を使用することは許可されていません。

4

1 に答える 1

0

つまり、複数のプロデューサーと1つの(バッファーされた)コンシューマーを持つプロデューサー-コンシューマーシナリオがあります。Reactive Extensions(.NET 3.5用のバージョンがあります)を確認することをお勧めします。少なくとも、のバックポートを活用できますBlockingCollection<T>

于 2012-11-25T12:55:51.043 に答える