【问题标题】:right way to create thread in ASP.NET web application在 ASP.NET Web 应用程序中创建线程的正确方法
【发布时间】:2009-12-01 09:09:46
【问题描述】:

我正在创建 asmx Web 服务,并且必须创建线程来执行后台 IO 以刷新系统数据。什么是正确的方法?我对创建线程的任何结果不感兴趣。我只希望 ASP.NET 工作线程创建一个正在加载的线程,最后进行一个分配(我认为 assign _alldata = newData 是原子的,其中我自己的大结构类 SystemData 的两个实例)所以创建的工作线程新线程可以立即传播。

我读了一篇文章http://msdn.microsoft.com/fi-fi/magazine/cc164128%28en-us%29.aspx#S2 建议使用非线程池线程。然而,这篇文章是关于不同/更复杂的场景,并没有对我有太大帮助。

谢谢:马蒂

PS。我也在what is the right way to spawn thread for database IO in asmx web service? 中问过这个问题,但这对于多个问题来说太复杂了。

【问题讨论】:

    标签: c# asp.net multithreading


    【解决方案1】:

    类似这样的:

    public delegate void Worker();
    private static Thread worker;
    
    public static void Init(Worker work)
    {
        worker = new Thread(new ThreadStart(work));
        worker.Start();
    }
    
    public static void Work()
    {
        // do stuff
    }
    

    然后拨打Init(Work)开始工作。

    如果您调用 BeginInvoke()ThreadPool.QueueUserWorkItem(),它使用 ASP.NET 线程池线程,这会影响您的应用程序的可伸缩性。

    如果有用,我会在我的书中详细介绍这些问题,以及代码示例、示例基准测试等:Ultra-Fast ASP.NET

    【讨论】:

    • 启动一个新线程不是比使用线程池中的线程占用更多资源吗?
    • 感谢您的回答!现在似乎与您和 SirMoreno 争论是否使用线程池线程......
    • 是的,启动一个新线程比线程池线程使用更多的资源。但是,我们的想法不是为每个操作都启动一个新线程。相反,只启动一个(或一小部分)您自己的线程,然后将某种类型的 WorkItems 传递给它们以供执行。同样,线程池线程的问题是它们会降低应用程序的可伸缩性,因为它们是用于处理页面本身的线程。
    • 再次感谢瑞克。我想我会选择非线程池线程。这是每 24 小时完成一次。所以不是每一个动作;)
    • 不使用线程池线程的一个问题是,如果应用程序池被回收,并且非线程池线程正在工作,它会被突然停止,但是如果我们使用线程池线程然后应用程序池回收将允许线程池线程运行完成。这就是我的理解。对吗?
    【解决方案2】:

    看看:

    http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx?fid=326357&df=90&mpp=25&noise=3&sort=Position&view=Quick

    你可以这样做:

     public delegate void MethodInvoker();
    
        private void Foo()
        {
            // sleep for 10 seconds.
            Thread.Sleep(10000);
        }
    
    protected void Button2_Click(object sender, EventArgs e)
    {
        // create a delegate of MethodInvoker poiting to
        // our Foo function.
        MethodInvoker simpleDelegate = new MethodInvoker(Foo);
    
        // Calling Foo Async
       simpleDelegate.BeginInvoke(null, null);
    
    }
    

    【讨论】:

    • 感谢您的回答!现在似乎与您和 RickNZ 争论是否使用线程池线程......
    • 如果线程不会占用大量 CPU 时间(等待 DB 等第三方),您最好使用自定义线程池:stackoverflow.com/questions/1031763/… 否则我认为 BeginInvoke 是正确的方法.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多