如何在一台web服务器上的ASP.NET网站和ASP.NET web服务之间同步对文件的访问

如何在一台web服务器上的ASP.NET网站和ASP.NET web服务之间同步对文件的访问,asp.net,web-services,multithreading,Asp.net,Web Services,Multithreading,我在同一个web服务器上部署了ASP.NET网站和ASP.NET web服务。它们都需要访问共享文件 如何实现/共享支持单个写入程序和多个读卡器的锁?如果有人读书,没有人会写字,但所有人都会读书。如果有人写入,没有人可以读/写。要打开文件进行写入,允许其他线程读取,请使用System.IO.file.open方法和System.IO.FileShare.read。即: System.IO.File.Open("path.txt",System.IO.FileMode.OpenOrCreate,S

我在同一个web服务器上部署了ASP.NET网站和ASP.NET web服务。它们都需要访问共享文件


如何实现/共享支持单个写入程序和多个读卡器的锁?如果有人读书,没有人会写字,但所有人都会读书。如果有人写入,没有人可以读/写。

要打开文件进行写入,允许其他线程读取,请使用System.IO.file.open方法和System.IO.FileShare.read。即:

System.IO.File.Open("path.txt",System.IO.FileMode.OpenOrCreate,System.IO.FileAccess.ReadWrite,System.IO.FileShare.Read)
其他(读取)线程应使用System.IO.FileAccess.Read

开放式方法签名:

public static FileStream Open(string path, FileMode mode, FileAccess access, FileShare share);
更新 如果需要所有实例局部写入文件。使用互斥类保留文件写入。即:

    Mutex mut = new Mutex("filename as mutex name");
    mut.WaitOne();
    //open file for write, 
    //write to file
    //close file
    mut.ReleaseMutex();

希望能有所帮助。

好吧,你可以这样做:

public class yourPage {
    static object writeLock = new object();
    void WriteFile(...) {
         lock(writeLock) {
              var sw = new StreamWriter(...);
              ... write to file ...
         }
}

基本上,此解决方案仅适用于文件将在短时间内打开以进行写入的情况。您可能想考虑为读者缓存文件,或者将文件写入一个临时文件,然后重命名以最小化对它的争用。

< P>使用RealeWrror锁或Read RealSerkLoSLIM(.NET 2)从System.Threading命名空间中创建一个类来处理单个编写器/多个读取器的情况。

如果在各自的线程中创建了该类的两个不同对象,这难道不是无关紧要的吗?他们每个人都会得到一份writeLock,从而使整个锁定方案变得毫无用处。我认为在创建不同的线程之前,应该将writeLock声明为“上游”,就像在Global.asax文件中一样。@Tudor:如果对象是“静态”的,那么每个进程只有一个实例,而不是每个线程。该变量对于所有线程来说都是全局变量。但是,您可以使用[ThreadStatic]属性对其进行修饰,它将与您描述的一样(无用!)