多线程:如何管理调用所有会话都错误地访问的 DLL 的 MVC 操作?

Multithreading: How to manage MVC Action that calls a DLL that all sessions mistakenly have access to?

我有一个 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\rootdc8c21\abb33c14\assembly\dl3\d826c723cea6a5c_62d8cf01.我猜每次并发访问它时,ASP.Net 不会为每个 user/session 创建一个新的 DLL 实例和一个新线程的新单元到 运行。

你肯定想在这种情况下使用锁。带超时的锁是个不错的选择。