C# 使用;使用;C中带有StreamWriter的语句#

C# 使用;使用;C中带有StreamWriter的语句#,c#,file,dispose,using,streamwriter,C#,File,Dispose,Using,Streamwriter,我的应用程序有一个记录器,它不断地将数据记录在许多不同的文件中。使用“使用”块中的StreamWriter对象同步登录每个文件。有时,我会收到一个异常,说我试图打开的文件正在被另一个进程使用 现在,我登录到的每个文件都有一个与客户机id关联的唯一名称。我的应用程序是多线程的,但在任何时间点,只有一个客户机实例处于活动状态,因此我确信同一个文件不会被多个线程打开。但是,对于每次尝试重新打开文件的日志,我的应用程序都会在不到1秒的时间内多次登录同一文件。这让我得出另一个结论,即“using”语句不会

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


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


我的结论是正确的还是导致异常的其他原因?

你的结论是错误的。使用Close或Dispose关闭(或退出using块)后,可以立即在另一个using块中重新打开文件


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

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

退出
using
语句后,不仅会调用
Close
,还会调用
Dispose
,因为
using
与语法sugare无关

try {
  //do stuff 
}
finally {
 //close, dispose stream object
}
因此,问题在于多线程访问,它以某种方式试图访问writer尚未处理的文件,这并不意味着使用语句的
不起作用,而是意味着它仍然必须完成它的任务

编辑


您可以尝试使用检查指定的文件句柄所有权。查看联机帮助以了解如何执行此操作。

我认为可能有另一个线程正在同时写入日志文件。请尝试输出(例如,到调试控制台)当前正在记录的线程的线程ID,并查看当您看到异常时是否获得了与之前ID不同的ID。或者,在该部分代码周围使用
lock
语句,看看问题是否消失。更可能的情况是您做错了什么,而不是.NET framework错误。在任何情况下:您都需要向我们展示您的代码。“我确信同一个文件没有被超过1个线程打开”-我建议您在这里是错的。你能补充一个关于你的线程如何工作的更详细的解释吗?好的,谢谢大家确认“关闭”实际上是即时的。所以我查看了我对logger方法的所有调用,我认为我已经找到了一个可能导致这种情况的场景。我现在的问题是,我该如何处理?我不想锁定记录器,因为我不想使它在所有线程之间完全同步。除了设置while循环以等待文件可用外,还有其他解决方案吗?谢谢。+1,线程A可以在打开文件后和处理文件之前中断。然后可以安排线程B并尝试打开相同的文件。围绕该部分的
lock
语句将防止这种情况发生。