0

私のコードは、メッセージ キューからトランザクション メッセージを読み取ります。コードは何千ものメッセージを実行しましたが、以前に読み取ったメッセージの 1 つをコミットすると、突然例外がスローされました。コミットは、メッセージを読んでいるスレッドとは別のスレッドで実行されますが、これは私の意見では問題にならないはずです。トランザクションに関するドキュメントでは、コミット メソッドやアボート メソッドをオブジェクトと同期するように指示されていません。この例外はモニターの使用に関連していますが、私はモニターを使用していません。基礎となるフレームワーク コードが使用している可能性がありますが、それは私の制御範囲外です。

メッセージキューで時限読み取りを行ったときに、この例外が時々発生していました。コードを書き直して、最初に非同期ピークを使用して、読み取るデータがあるかどうかを確認するようにしました。このようにして、発生する例外を回避しました。しかし今はまた戻ってきました。

この例外を回避する方法を教えてください。または、これは C# フレームワークの基になるコードのバグですか?

よろしくマルティエン

// Part of thread code that reads transaction
transaction = new MessageQueueTransaction();
transaction.Begin();
message = _ItfSureStoreInstance.MQSet.MQ_Retry.mqueue.Receive(transaction);

// We have data received
DataImplementation<TMessage> dataRxd = new DataImplementation<TMessage>(this,message,transaction,true);
4

1 に答える 1

1

http://msdn.microsoft.com/en-us/library/system.messaging.messagequeuetransaction.aspxはかなりよく文書化されています。これは、シングル スレッド アパートメント (STA) スレッドでは使用できないことを詳しく説明しています。Winforms アプリケーションは、メイン (UI) スレッドで STA でなければなりません。つまりMessageQueueTransaction、WinForm (またはデフォルトのコンソール アプリケーションのメイン スレッド) からの使用はサポートされていません (つまり、ときどき失敗します)。

推奨される使用方法はMessageQueueTransaction、新しい MTA スレッドから実行することです。これを行うnew Threadか、使用することができますTask.Factory.StartNew

于 2013-03-12T15:01:50.630 に答える