首页 文章

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

提问于
浏览
1

我有一个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 回答

  • 0

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

相关问题