2009-12-01 73 views
19

我創建asmx Web服務並且必須創建線程來執行後臺IO以刷新系統數據。什麼是正確的方式?我不想讓任何結果創建線程。我只是希望ASP.NET工作線程創建一個線程,它是否加載並最終進行一次賦值(我認爲在我自己的大型結構類SystemData的兩個實例中分配_alldata = newData是原子),因此創建的工作線程新線程可以即時傳播。在ASP.NET Web應用程序中創建線程的正確方法

我看了一篇文章http://msdn.microsoft.com/fi-fi/magazine/cc164128%28en-us%29.aspx#S2,建議使用非線程池線程。這篇文章是關於不同/更復雜的情況,並沒有太多幫助我。

感謝:Matti

PS。我也在what is the right way to spawn thread for database IO in asmx web service?中問過這個問題,但這個問題太複雜了,有很多問題。

回答

28

事情是這樣的:

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

+0

沒有開始一個新的線程需要更多的資源,然後使用線程池中的線程? – SirMoreno 2009-12-01 12:16:57

+0

感謝您的回答!現在似乎有與您和SirMoreno爭論是否使用線程池線程或不... – 2009-12-01 13:34:46

+1

是的,啓動一個新線程使用比線程池線程更多的資源。然而,這個想法並不是爲每一個行動開始一個新的線索。相反,只需啓動一個(或少量)自己的線程,然後將某種WorkItems傳遞給它們以供執行。同樣,線程池線程的問題在於它們會降低應用程序的可伸縮性,因爲它們與用於處理頁面的線程相同。 – RickNZ 2009-12-01 13:52:53

4

看看:

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

} 
+0

BeginInvoke()使用ASP.NET線程池線程。 – RickNZ 2009-12-01 10:20:43

+0

感謝您的回答!現在似乎有與你和RickNZ辯論是否使用線程池線程或... – 2009-12-01 13:35:19

+0

如果線程不會使用大量的CPU時間(等待數據庫第三方)您最好使用自定義線程池:http://stackoverflow.com/questions/1031763/net-custom-threadpool-with-separate-instances 否則,我認爲BeginInvoke是正確的方法。 – SirMoreno 2009-12-01 14:42:44

相關問題