我有一个ActiveReports [ActiveReports版本8,.Net] DLL,我的代码在 Print
控制器的 Preview
动作中调用 . 出于某种原因,当用户同时访问它时(当然是来自不同的会话),数据会被破坏,他们会看到彼此的数据或缺少数据 .
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为每个访问Action的用户创建单独的工作进程是否需要做太多工作?
这可能并不重要,但是当ASP.Net实例化ActiveReports DLL(我没写过)时,它似乎被抛入了一个类似于它的路径,如 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\19dc8c21\abb33c14\assembly\dl3\d826c723\5cea6a5c_62d8cf01
. 我猜每次它被同时访问时,ASP.Net不会创建一个新的DLL实例和一个新的公寓,以便为每个用户/会话运行一个新的线程 .
1 回答
你肯定想在这种情况下使用锁 . 锁定超时是一个不错的选择 .