C#multiprocess访问同一个文件

时间:2015-04-19 18:58:55

标签: c# asp.net

我的项目包括一个Windows客户端应用程序和ASP网页...

windows app在网页服务器上执行。 Windows客户端和ASP网页在同一台服务器上协同工作,并在同一个共享文件上工作......

我想安全访问这些文件,windows app等网页完成文件和/或网页上的工作等待windows app完成这些文件的工作..

我在Windows应用和ASP网页中使用EventWaitHandle waithandle=new EventWaitHandle(true, EventResetMode.AutoReset, "SI_handle");

并且在ASP网页和Windows应用程序中,在访问文件之前使用waithandle.WaitOne();,在完成文件处理之后使用waithandle.Set();

我的问题是Windows应用o网页在waithandle.WaitOne();上等待,应用或网页会冻结。

我的错?

这样的窗口或网页代码:

if (File.Exists(xml_path))
{
    waithandle.WaitOne();
    // work on file
    waithandle.Set();
}

2 个答案:

答案 0 :(得分:6)

为什么不简单地使用操作系统来帮助您,因为您可以通过指定open FileShare.None指定不应共享访问权限的文件。{{3}}。如:

try
{
    using (var stream = File.Open("my file name", FileMode.Open, FileAccess.ReadWrite, FileShare.None))
    {
        // Do with it what you want.
    }
}
catch (IOException ex)
{
    if (IsFileLocked(ex)
        // try later.
    else
        // report error.
}

...

const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;

private static bool IsFileLocked(Exception exception)
{
    int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
    return errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION;
}

答案 1 :(得分:0)

当机器上的每个应用程序启动时,它们都需要open system mutex

例如 - 在每个应用程序中创建一个全局变量:

System.Threading.Mutex _multiAppMutex = null;

// application start logic
try
{
    _multiAppMutex = System.Threading.Mutex.OpenExisting("MultiApp");
}
catch 
{
    // the only reason we should be here it because this app is the first one to start
    _multiAppMutex = new System.Threading.Mutex("MultiApp");
}

然后在您想要同步的任何代码中,您将使用该系统互斥

if (File.Exists(xml_path))
{
    _multiAppMutex.WaitOne();
    // work on file
    _multiAppMutex.ReleaseMutex();
}