使用"c#中的StreamWriter语句

本文关键字:中的 StreamWriter 语句 quot 使用 | 更新日期: 2023-09-27 18:12:04

我的应用程序有一个记录器,它不断地在许多不同的文件中记录数据。每个文件的登录都是使用"using"块中的StreamWriter对象同步完成的。有时,我得到一个异常,说我试图打开的文件正在被另一个进程使用。

现在,我登录到的每个文件都有一个与客户端id相关联的唯一名称。我的应用程序是多线程的,但是在任何时候只有一个客户端实例是活动的,所以我确信同一个文件不会被超过1个线程打开。但是,我的应用程序在不到1秒的时间内多次记录同一个文件,每次日志都试图重新打开文件。这让我得出了另一个结论,即"using"语句不会立即关闭文件(尽管我读到过它对文件是这样做的),而只是处理它并等待GC处理关闭。

我的结论是正确的还是引起异常的其他东西?

使用"c#中的StreamWriter语句

退出using语句后,不仅要调用Close,还要调用Dispose,因为using只是

的语法糖。
try {
  //do stuff 
}
finally {
 //close, dispose stream object
}

所以问题是在多线程访问中,以某种方式试图访问一个文件谁写器还没有处理,这并不意味着using语句不工作,但意味着它仍然要完成它的工作。

编辑

您可以尝试使用ProcessExplorer来检查指定的文件句柄所有权。查看在线帮助了解如何操作

你的结论不正确。一旦使用Close或Dispose关闭(或退出using块),您就可以立即在另一个using块中重新打开文件。

一定有其他线程在使用这个文件

using语句将调用FileStream上的Dispose,这将立即释放底层文件句柄。您的问题是由于文件写入重叠。