0

II6を使用しています。例外があったと思われるMethod(LogMessageToSIFDB)がありますが、

Task.Factory.StartNew(() => LogMessageToSIFDB(inClientID, tmpByte, Modified, SIF_MessageID, SIF_TimeStamp));

方法は非常に簡単です

  1. DBに接続する
  2. Sprocを呼び出す
  3. 接続を閉じる

DB接続が正常に機能するようになりました。私が抱えている問題は、例外が発生した場合、何もログに記録されないことです。

ロジックフローを変更すると、SProcが呼び出されず、イベントなどに何もログに記録されません。

  1. 新しいApplicationException( "Hello from LogMessageToSIFDB()");をスローします。
  2. DBに接続する
  3. Sprocを呼び出す
  4. 接続を閉じる

一言で言えば、これは何かがログに記録される原因となることは何もしません。

Task.Factory.StartNew(() => { throw new ApplicationException("Hello from LogMessageToSIFDB()"); });

これが私がやろうとしていることです。このコードは、エンジニアリングから提供されたインターフェイスを実装するDLLに含まれています。それらは、XMLメッセージであるストリームを渡します。そのメッセージを変更する必要があります。元のメッセージもログに記録する必要があります。

メッセージをDBに記録すると、IISスレッドのブロックが長くなるだけなので、タスクを作成して非同期で実行することにしました。呼び出しがたまに機能しない場合、私は本当に気にしませんが、現在の問題をデバッグしている場合は、エラーメッセージを表示する必要があります。

タスクの未処理の例外がイベントログに表示されることを期待していましたが、どこにも何も表示されていません。

非同期ロギングは必須ではありませんが、推奨されます。最悪の場合は、タスクを削除して同期して実行することです。

4

1 に答える 1

1

sを使用すると、または(例外をスローし、で囲まれている)を使用するか、そのプロパティに直接アクセスすることによって、何らかの方法Taskで例外を監視することが期待されます。TaskWait()ResultAggregateExceptionException

これを行わずTaskにガベージコレクションを取得すると、ファイナライザーが例外をスローし、プロセス全体がダウンします(.Net 4.5ではこれが変更されますが、ファイナライザーはスローしなくなります)。ただし、GCは決定論的ではなく、長い時間が経過した後にのみ収集される可能性があることを覚えておく必要がありますTask。これが、何も表示されない理由である可能性があります。

あなたがすべきことは、どういうわけか例外を観察することです。非同期で実行したい場合は、とContinueWith()一緒に使用できますOnlyOnFaulted。しかし、ここでのより簡単な方法は、通常のtry- catch:を使用することです。

Task.Factory.StartNew(() =>
{
    try
    {
        LogMessageToSIFDB(inClientID, tmpByte, Modified, SIF_MessageID, SIF_TimeStamp));
    }
    catch (Exception ex)
    {
        // perform your logging here
    }
});
于 2012-07-20T00:12:37.620 に答える