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

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;

我有一个ActiveReports[ActiveReports version 8.Net]DLL,我的代码在我的
打印
控制器的
预览
操作中调用它。由于某种原因,当用户同时(当然是从不同的会话)访问数据时,数据会被破坏,他们会看到彼此的数据或缺少数据

    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.