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