在ASP.NET Web应用程序中创建线程的正确方法

时间:2009-12-01 09:09:46

标签: c# asp.net multithreading

我正在创建asmx Web服务,并且必须创建线程来执行后台IO来刷新系统数据。什么是正确的方法?我对创建线程没有任何结果感兴趣。我只是希望ASP.NET工作线程创建一个执行它加载的线程,最后进行一次分配(我认为分配_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?中提出了这个问题,但这个问题太复杂了。

2 个答案:

答案 0 :(得分:29)

这样的事情:

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

答案 1 :(得分:5)

看看:

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);

}