Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 函数锁和互斥锁在IIS Express和IIS中的使用表现不同_C#_Asp.net_Pdf_Iis_Wkhtmltopdf - Fatal编程技术网

C# 函数锁和互斥锁在IIS Express和IIS中的使用表现不同

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

在我的web应用程序中,我使用
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
}