我的项目包括一个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();
}
答案 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();
}