Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时使用StreamWriter和FileSystemWatcher_C#_.net_Vb.net_Filesystemwatcher_Streamwriter - Fatal编程技术网

C# 同时使用StreamWriter和FileSystemWatcher

C# 同时使用StreamWriter和FileSystemWatcher,c#,.net,vb.net,filesystemwatcher,streamwriter,C#,.net,Vb.net,Filesystemwatcher,Streamwriter,我有一个使用FileSystemWatcher类监视目录更改的程序。我有一些其他客户端使用StreamWriter写入此目录。有时,在filesystemwatcher创建的事件中,当我尝试访问该文件时,会出现错误 这很难调试,因为它并不经常发生。客户端通过将流封装在Using块中来正确关闭流。错误在该应用程序的行上,无法使用该文件,因为其他进程正在使用该文件。我不太明白这一点,当客户端使用相同的代码将文件写入目录时,为什么错误只是偶尔出现。有时,手动复制会在大多数情况下出错 该目录不是网络目录

我有一个使用FileSystemWatcher类监视目录更改的程序。我有一些其他客户端使用StreamWriter写入此目录。有时,在filesystemwatcher创建的事件中,当我尝试访问该文件时,会出现错误

这很难调试,因为它并不经常发生。客户端通过将流封装在Using块中来正确关闭流。错误在该应用程序的行上,无法使用该文件,因为其他进程正在使用该文件。我不太明白这一点,当客户端使用相同的代码将文件写入目录时,为什么错误只是偶尔出现。有时,手动复制会在大多数情况下出错

该目录不是网络目录,而是本地目录。请建议

客户端代码

using (StreamWriter ss = new StreamWriter(input)) {
    ss.WriteLine(args(0));
    ss.Close();
}
监视应用程序事件代码

public void Temp()
{
FileSystemWatcher fs = new FileSystemWatcher();

fs.Path = GlobalStatics.PathWorkOrders;
fs.IncludeSubdirectories = false;
fs.Filter = "*.wo";
fs.EnableRaisingEvents = true;

fs.Created += CreatedEvent;
}

public void CreatedEvent(object sender, System.IO.FileSystemEventArgs e)
    {
        string guidStr = Path.GetFileNameWithoutExtension(e.FullPath);

        using (StreamReader sr = new StreamReader(e.FullPath))
        {
            //Processing
            sr.Close();
        }
    }

没有代码有点难,但我想你看到了一个比赛条件。我相信大多数时候都是这样

进程A正在使用StreamWriter更新文件,并锁定该文件。 进程A完成更新并关闭文件。 FileSystemWatcher将唤醒并处理该文件

有时,由于无法控制的时间问题,顺序有些不同:

进程A正在使用StreamWriter更新文件,并锁定该文件

FileSystemWatcher将唤醒并处理该文件。 进程A完成更新并关闭文件

由于文件已锁定,您的观察者无法处理它

如果出现异常,您应该稍后再试


编辑:看了代码之后,我的答案仍然有意义。

你能展示你正在使用的代码吗?如果这是在for循环中完成的,那么你可能需要创建StreamWriter的实例,但如果没有看到你的代码就无法判断。这是不可避免的。您将等待一段时间,然后重试。在创建StreamReader对象之前,请尝试使用Thread.sleep1000!曾几何时,我在一个进程中使用FileSystemWatcher和在另一个进程中编写时遇到了完全相同的问题。正如您所说,稍后再尝试加载文件是我遇到错误时需要解决的问题。