C#多进程访问同一文件

C#多进程访问同一文件,c#,asp.net,C#,Asp.net,我从事的项目包括windows客户端应用程序和ASP网页 windows应用程序在网页服务器上执行。 windows客户端和ASP网页在同一服务器上协同工作,并在同一共享文件上工作 我希望安全访问这些文件,windows应用程序等待网页完成对文件的操作和/或网页等待windows应用程序完成对这些文件的操作 我使用EventWaitHandle waithandle=neweventwaithandle(true,EventResetMode.AutoReset,“SI_handle”) 在AS

我从事的项目包括windows客户端应用程序和ASP网页

windows应用程序在网页服务器上执行。 windows客户端和ASP网页在同一服务器上协同工作,并在同一共享文件上工作

我希望安全访问这些文件,windows应用程序等待网页完成对文件的操作和/或网页等待windows应用程序完成对这些文件的操作

我使用
EventWaitHandle waithandle=neweventwaithandle(true,EventResetMode.AutoReset,“SI_handle”)

在ASP网页和windows应用程序上使用
waithandle.WaitOne()
在访问文件和
waithandle.Set()之前完成文件上的工作后

我的问题是windows app o网页在
waithandle.WaitOne()上永远等待和应用程序或网页冻结

我怎么了

windows或网页代码如下:

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

您为什么不直接使用操作系统来帮助您,因为您可以通过指定一个文件来指定不应共享访问权限。例如:

试试看
{
使用(var stream=File.Open(“我的文件名”,FileMode.Open,FileAccess.ReadWrite,FileShare.None))
{
//你想怎么做就怎么做。
}
}
捕获(IOEX异常)
{
如果(IsFileLocked)(ex)
//稍后再试。
其他的
//报告错误。
}
...
const int ERROR\u SHARING\u违例=32;
const int ERROR\u LOCK\u违例=33;
私有静态bool IsFileLocked(异常)
{

int errorCode=Marshal.GetHRForException(exception)&(1当机器上的每个应用程序启动时,它们将需要执行以下操作

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

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();
}

如果你在web应用程序和windows应用程序中都有相同的代码,那么很明显发生了什么。它们都在点击“waitone”同时,由于它们都在等待,因此它永远不会到达集合。您需要重新考虑您的等待句柄逻辑。使用两个进程测试了此想法,它实际上似乎有效。您确定在
waitHandle.set()之前没有收到异常吗
?您肯定应该使用
try..finally
这里,@MichaelSander i添加了try..finally,但它不会起作用:(“System.Threading.Mutex”不包含“Set”的定义,并且找不到接受“System.Threading.Mutex”类型的第一个参数的扩展方法“Set”(是否缺少using指令或程序集引用?)我更正了密码,是的
if (File.Exists(xml_path))
{
    _multiAppMutex.WaitOne();
    // work on file
    _multiAppMutex.ReleaseMutex();
}