C# 函数锁和互斥锁在IIS Express和IIS中的使用表现不同
在我的web应用程序中,我使用C# 函数锁和互斥锁在IIS Express和IIS中的使用表现不同,c#,asp.net,pdf,iis,wkhtmltopdf,C#,Asp.net,Pdf,Iis,Wkhtmltopdf,在我的web应用程序中,我使用wkhtmltopdf处理报告,将其输出为PDF格式。我有几个函数,可以一起编译一些HTML、一些标题等,然后将这些信息传递到wkhtmltopdf以编译PDF并提供给用户 比如: public JsonResult BuildPDF(string one, string two, SomeData[] data, SomeList[] { lock(PDFLock) { // ... Code here to compile HTML and sav
wkhtmltopdf
处理报告,将其输出为PDF格式。我有几个函数,可以一起编译一些HTML、一些标题等,然后将这些信息传递到wkhtmltopdf
以编译PDF并提供给用户
比如:
public JsonResult BuildPDF(string one, string two, SomeData[] data, SomeList[] {
lock(PDFLock) {
// ... Code here to compile HTML and save to files
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\inetpub\wwwroot\MySite\wkhtmltopdf.exe";
psi.UseShellExecute = true;
psi.Verb = "runas";
...
Process p = Process.Start(psi);
p.WaitForExit();
}
}
编译完PDF后,我将其推送给用户,然后删除该文件
正如您所看到的,我在这个函数周围有一个锁,以防止两次尝试同时处理PDF在IIS Express上
此函数的行为与我预期的一样:如果两个请求在同一时间发出,将处理第一个请求,第二个请求将在锁上等待,直到第一个请求完成。
在IIS版本中,它似乎忽略了此锁,并且不会等待第一个请求完成。实际上,它跳过函数的速度太快,以至于第一个请求仍在运行,而第二个请求完成(未成功),因此用户收到一条消息,表示请求失败
我不确定为什么它会忽略这个锁,或者为什么它会在调试(IIS Express)中工作
这是否可能是由于IIS的配置造成的
编辑:
lock
的问题是IIS中多个工作进程的问题。我现在用多个进程再次测试互斥
编辑:
互斥体用法:互斥体在类中声明为private static Mutex mut=new Mutex()代码>
然后在下载方法中:
public virtual void Download() {
// ... Response headers and stuff
Response.TransmitFile(@"C:\inetpub\wwwroot\MySite\temppdfs\pdfout.pdf");
Response.End();
System.IO.File.Delete(@"C:\inetpub\wwwroot\MySite\temppdfs\pdfout.pdf");
mut.ReleaseMutex();
}
我对lock
和Mutex
用法的理解有点偏差
lock
无法工作的原因是IIS中的我的应用程序池允许多个工作进程(4),因此锁无法跨进程工作
我在函数之外声明了Mutex
,从而不正确地使用了Mutex
,现在在我的情况下正确使用了Mutex
(在应用程序池中使用多个进程发布IIS):
Mutex
的这种使用似乎在多个进程和多个函数中都是成功的。我的理解是Process.Start
不会阻止当前线程(即进程启动后将继续执行)。如果这是真的,您的锁将在进程仍在运行时被释放。嗯,可能是这样,但我不确定为什么它在IIS Express中正常工作:SI还应该注意,我有p.WaitForExit()代码>,我希望它会一直阻止,直到进程退出
public virtual void Download() {
// ... Response headers and stuff
Response.TransmitFile(@"C:\inetpub\wwwroot\MySite\temppdfs\pdfout.pdf");
Response.End();
System.IO.File.Delete(@"C:\inetpub\wwwroot\MySite\temppdfs\pdfout.pdf");
mut.ReleaseMutex();
}
public JsonResult BuildPDF(string one, string two, SomeData[] data, SomeList[] {
Mutex mut = new Mutex(false, @"Global\PDFMutex");
mut.WaitOne();
// ... Code here to compile HTML and save to files
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\inetpub\wwwroot\MySite\wkhtmltopdf.exe";
psi.UseShellExecute = true;
psi.Verb = "runas";
...
Process p = Process.Start(psi);
p.WaitForExit();
mut.ReleaseMutex();
//... Return some JSON to user
}