C# 多线程:如何管理调用所有会话错误访问的DLL的MVC操作?
我有一个ActiveReports[ActiveReports version 8.Net]DLL,我的代码在我的C# 多线程:如何管理调用所有会话错误访问的DLL的MVC操作?,c#,asp.net-mvc,multithreading,activereports,C#,Asp.net Mvc,Multithreading,Activereports,我有一个ActiveReports[ActiveReports version 8.Net]DLL,我的代码在我的打印控制器的预览操作中调用它。由于某种原因,当用户同时(当然是从不同的会话)访问数据时,数据会被破坏,他们会看到彼此的数据或缺少数据 public ActionResult Preview(int? id) { if (id != null) { string reportInfo = null;
打印控制器的预览操作中调用它。由于某种原因,当用户同时(当然是从不同的会话)访问数据时,数据会被破坏,他们会看到彼此的数据或缺少数据
public ActionResult Preview(int? id)
{
if (id != null)
{
string reportInfo = null;
....
MyARNamespace.ActiveReportsClass report = new MyARNamespace.ActiveReportsClass();
try
{
using (MemoryStream stream = new MemoryStream())
{
reportInfo = report.RunReport(parameters, stream);
if (stream.Length != 0)
{
stream.Position = 0;
byte[] pdf = stream.ToArray();
return File(pdf, "application/pdf");
}
else
{
return HttpNotFound(reportInfo);
}
}
}
catch(Exception ex)
{
return HttpNotFound("Error Generating PDF. " + ex.Message);
}
}
else
{
return HttpNotFound();
}
}
我知道如何创建一个基本的锁对象,我猜我必须实现某种锁机制,以确保每个用户都有对线程的独占访问权。我不希望后续用户失败,但他们可以等待。对它们进行排队的最佳方式是什么,或者让ASP.Net为访问该操作的每个用户创建单独的工作进程会不会太多
这可能并不重要,但当ASP.Net实例化ActiveReports DLL(我没有编写该DLL)时,它似乎被扔到了一个单元中,它有自己的路径,如C:\Windows\Microsoft.Net\Framework\v4.0.30319\Temporary ASP.Net Files\root\19dc8c21\abb33c14\assembly\dl3\d826c723\5cea6a5c\U 62d8cf01
。我猜每次并发访问时,ASP.Net都不会创建DLL的新实例,也不会为每个用户/会话运行的新线程创建一个新单元。在这种情况下,您肯定希望使用lock。带超时的锁是一个不错的选择。在这种情况下,您肯定希望使用锁。带超时的锁是一个不错的选择。使用锁
将对它们进行排队(但不一定是FIFO)。除非所做的工作很多(在这种情况下,您可能希望实现轮询,这样用户就不会超时),否则您可以非常简单地使用一个锁。我对它进行了更深入的研究,看起来您对排队的看法是正确的!FIFO也没什么大不了的。谢谢+1使用锁将对它们进行排队(但不一定是FIFO)。除非所做的工作很多(在这种情况下,您可能希望实现轮询,这样用户就不会超时),否则您可以非常简单地使用一个锁。我对它进行了更深入的研究,看起来您对排队的看法是正确的!FIFO也没什么大不了的。谢谢+1.