9

Windows Azure Storage SDK で Web ジョブを使用しています。新しいアイテムがキューに表示されると、クラスのメソッドが呼び出されます。SDK docsによると、メソッドのパラメーターとして TextWriter を使用すると、SDK は、Webjob のログ インフラストラクチャに表示される、書き込み可能な TextWriter を提供します。これにより、問題の診断とトラブルシューティングが非常に簡単になります。

public async static void ProcessQueueMessage([QueueTrigger("queueName")]MyModelType model, TextWriter logger)
{

    await logger.WriteLineAsync(string.Format("Processing Item {0}", model.SasUrl));

    // Some work here

    await logger.WriteLineAsync(string.Format("Done Processing Item {0}", model.SasUrl));
}

ただし、非常に頻繁に、私のメソッドの本体内で TextWriter が破棄されています。2 番目の logger.WriteLineAsync で次の例外が発生します。

System.ObjectDisposedException was unhandled by user code
  HResult=-2146232798
  Message=Cannot write to a closed TextWriter.
  Source=mscorlib
  ObjectName=""
  StackTrace:
       at System.IO.__Error.WriterClosed()
       at System.IO.StringWriter.Write(Char[] buffer, Int32 index, Int32 count)
       at System.IO.TextWriter.WriteLine(String value)
       at System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
       at System.IO.TextWriter.SyncTextWriter.WriteLineAsync(String value)
       at NameOfProject.Program.<ProcessQueueMessage>d__8.MoveNext() in c:\Dev\Path\To\Program.cs:line 173
  InnerException:

この問題を抱えている人を他に見つけることができないため、SDK または webjobs インフラストラクチャにバグがあるとは考えられません。

呼び出しの前にロガーが破棄されたかどうかを確認する方法はありますか?

WebJobs ログ サブシステムと UI に参加するメソッド内に新しいロガーを作成する方法はありますか?

4

1 に答える 1

30

これは、メソッドが を返すためvoidです。Task代わりに戻ってみてください

于 2015-07-22T18:24:27.277 に答える