9

我正在使用带有 Windows Azure 存储 SDK 的 Webjob。当队列中出现一个新项目时,我的类中的一个方法被调用。根据SDK 文档,如果我将 TextWriter 作为我的方法的参数,SDK 将为我提供一个我可以写入的 TextWriter,它将显示在 Webjob 的日志记录基础设施中。这使得诊断问题和排除故障变得非常容易。

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 经常被丢弃。我在第二个 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 回答