我有以下无害的代码段:
using (var sw = new StreamWriter(path))
{
await sw.WriteAsync(msg.BodyText);
}
这是在Windows服务的后台线程上运行的异步任务中。该任务实质上是一个消息泵,它从消息队列中读取消息并将消息写入磁盘。这是写入文件系统的唯一代码行。
这些消息泵任务很多。它们的初始化方式如下:
_tasks = _config.MessagePumps.Select((pump) =>
{
return Task.Factory.StartNew(() =>
StartMessagePump(pump, _source.Token), TaskCreationOptions.LongRunning);
}).ToArray();
我知道StreamWriter出于性能原因在写操作期间使用缓冲,并且将其包装在using块中可确保在处理StreamWriter时刷新缓冲区。调用此代码的Task确实支持取消 处理la
while(!token.IsCancellationRequested)
{
var msg = await GetNextMessage();
await SaveMessage(msg);
}
服务停止后,OnStop
事件处理程序将依次调用CancellationTokenSource.Cancel()
和Task.WaitAll()
,以等待所有后台任务完成,如下所示:
protected override void OnStop()
{
_source.Cancel();
Task.WaitAll(_tasks);
}
问题是,在服务停止后我检查写入的文件时,在启动停止时正在活动写入的所有文件都不完整。有什么明显的我可以忽略的吗?您可以提供任何故障排除建议吗?