在C#中使用StreamWriter的“using”语句

时间:2011-10-24 07:10:59

标签: c# file dispose using streamwriter

我的应用程序有一个记录器,可以不断地将数据记录在许多不同的文件中。使用“using”块内的StreamWriter对象同步完成登录每个文件。我不时会得到一个例外,说我正在尝试打开的文件正由另一个进程使用。

现在我登录的文件都有一个与客户端ID相关联的唯一名称。我的应用程序是多线程的,但在任何时间点只有一个客户端实例是活动的,所以我确信同一个文件不会由多个线程打开。但是,对于尝试重新打开文件的每个日志,我的应用程序会在不到1秒的时间内多次登录同一文件。这让我得出另一个结论,即“using”语句不会立即关闭文件(即使我已经读过它对文件有效),但只处理它并等待GC处理结束。

我的结论是正确的还是引起异常的其他因素?

3 个答案:

答案 0 :(得分:2)

退出using语句后,不仅会调用Close,还会调用Dispose,因为using不是其他内容,而是语法为

try {
  //do stuff 
}
finally {
 //close, dispose stream object
}

所以问题在于多线程访问,它以某种方式尝试访问尚未处理的编写器的文件,这并不意味着using语句不起作用,而是意味着它仍然必须完成它的工作。

修改

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

答案 1 :(得分:0)

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

必须有一些其他线程使用该文件。

答案 2 :(得分:0)

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