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

cha*_*r m 23 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.我也问过这个问题,在asmx web服务中为数据库IO生成线程的正确方法是什么?但这个问题太复杂了.

Ric*_*kNZ 30

像这样的东西:

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
}
Run Code Online (Sandbox Code Playgroud)

然后通过调用开始Init(Work).

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

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

  • 不使用线程池线程的一个问题是,如果应用程序池被回收,并且非线程池线程处于其工作的中间,它将突然停止,但如果我们使用线程池线程,则应用程序池回收将允许线程池线程运行完成.多数民众赞成我的理解.对? (2认同)

Sir*_*eno 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);

}
Run Code Online (Sandbox Code Playgroud)