我正在创建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?中提出了这个问题,但这个问题太复杂了。
答案 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)
看看:
您可以执行以下操作:
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);
}