【问题标题】:Memory Usage in ASP.NET with Multithreading带有多线程的 ASP.NET 中的内存使用情况
【发布时间】:2014-12-06 15:21:37
【问题描述】:

我已经阅读了一些关于 ASP.NET 中的多线程的文章

但我不明白什么是最好的...Task、Thread、ThreadPool 或 Delegate.BeginInvoke。 我在页面上有 Excel 上传按钮, excel上传完成后,应验证数据, 并应显示验证进度, 因为为什么验证过程在新线程中运行。

这里是代码示例

protected void btnValidation_OnClick(object sender, EventArgs e)
{
    var excelData = Session["UploadedExcelData"];
    var validator = new DataValidator(excelData);
    validator.Start();
}


public class DataValidator
{
    private readonly IList<IDictionay<String, Object>> excelData;

    public DataValidator(IList<IDictionay<String, Object>> excelData)
    {
        this.excelData = excelData;
    }

    public void Start()
    {
        var t = new Thread(ValidateData);
        t.Start();
    }

    private void ValidateData()
    {
        //data validation code
    }
}

真正的问题是生产服务器上的内存使用, 如果验证过程在没有线程的情况下运行,则内存使用量约为 12GB, 但如果验证过程在新线程或新任务中运行,则内存使用量约为 25GB

附言 我知道...使用 ThreadPool 或 Delegate.BeginInvoke 进行多线程处理是个坏主意,因为 ASP.NET Page.Requests 使用 ThreadPool

【问题讨论】:

    标签: asp.net multithreading memory webforms


    【解决方案1】:

    请参考 Stephan Cleary 的Introduction to Async/Await on ASP.NET。在其中,他解释了使用 Tasks、async/await 来利用 ASP.Net 线程池的好处。我从中得到的是,如果它可以阻止您的线程池线程,但最终由其他东西(用于 API 调用的其他服务器、数据库服务器、磁盘 IO 或其他)处理,请使用异步以便线程池线程回到池中,其他机制,例如来自驱动程序的中断,将冒泡任务完成状态。

    也就是说,听起来您的密集验证代码继续使用 ASP.Net 线程池线程来处理数据。在这种情况下,我看不到线程/异步的好处。传奇程序员Jon Skeet 在堆栈溢出答案和Pluralsight training video 中提到,创建新线程至少使用堆栈上的 1 MB 内存,并尽可能避免创建新线程。我不知道这是否会导致您的应用使用大量 RAM,但到目前为止我同意 Walther。

    现在,您的数据验证可以并行化吗?这可能是尝试异步/线程的原因。这里的好处是验证速度更快。请参阅Parallel class。例如,您似乎正在验证一个 Excel 文档,那么您能否在合理使用线程数的情况下同时验证多个行或单元格?

    最后,在 ASP.Net 中,我所知道的唯一可以在不通过 AJAX 发送多个请求询问事情进展情况的情况下传递事件(例如验证步骤的进度)的方法是 ASP.Net Signalr。它基于 WebSockets 用于服务器发送事件。您可以在验证期间不时地向下推进度值,以使您的 UI 随时了解情况。

    希望这至少能有所帮助。

    【讨论】:

    • OOOHH YAHHH SignalR 很酷:D
    【解决方案2】:

    如果您需要在 asp.net 中进行任何异步操作(验证、延迟加载等),则应始终使用 AJAX。就这么简单。

    Web 是无状态的,当您有成千上万的人连接到您的网站时,多线程并不适合。此外,在使用新线程进行验证时,我看不到任何好处。目的是什么??您正在创建新线程而没有任何真正的理由来备份它。

    【讨论】:

    • 正如我上面提到的,我需要显示验证进度,因为验证过程可以是长时间运行的线程,我也不想在 Web.Config 中增加请求超时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多