Windows服务停止时,正在使用using块的StreamWriter.WriteAsync无法写入整个文件

时间:2019-02-19 19:36:17

标签: c# windows-services streamwriter

我有以下无害的代码段:

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);
}

问题是,在服务停止后我检查写入的文件时,在启动停止时正在活动写入的所有文件都不完整。有什么明显的我可以忽略的吗?您可以提供任何故障排除建议吗?

0 个答案:

没有答案