2012-01-12 115 views
6

我有一個Web服務,它可以分解爲兩個主要部分:ASP.Net Web服務:運行代碼以異步方式

[WebMethod] 
MyServiceCall() 
{ 
    //Do stuff the client cares about 

    //Do stuff I care about 
} 

我希望做的是運行在另一個線程第二部分,這樣客戶端就不會等待它:一旦用戶的邏輯完成,立即向他們發送他們的信息,但是繼續處理我關心的東西(記錄等)。

從Web服務,什麼是運行第二張異步,以儘快獲得用戶回到他們的信息的推薦方法是什麼? BackgroundWorkerQueueUserWorkItem

+2

你閱讀本:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background -tasks-in-asp-net.aspx – 2012-01-12 17:41:35

回答

4

你可能想看看Tasks這是新的.NET 4.0。

它可以讓你開球異步操作,但也給你一個簡單的方法,如果它做或不晚。

var task = Task.Factory.StartNew(() => DoSomeWork()); 

它會啓動DoSomeWork()並繼續而不用等待,因此您可以繼續進行其他處理。當你到了一個你不想直到你的異步任務已經完成了到處理點,您可以撥打:

task.Wait(); 

這將等在那裏,直到任務完成。如果你想從任務中得到結果,你可以這樣做:

var task = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 
    return "dummy value"; 
}); 
Console.WriteLine(task.Result); 

調用task.Result塊直到結果可用。

這裏是一個涵蓋了更詳細的任務教程:http://www.codethinked.com/net-40-and-systemthreadingtasks

+0

接受這個答案;然而,我認爲在閱讀Darin Dimitrov的評論中的博客文章之後,我將暫緩實際執行此操作。聽起來像這樣做可能會有問題,如果它正在運行的域停止/回收 – John 2012-01-12 19:12:33

1

仍然發射一個新的線程,最簡單的方法可能是:

new Thread(() => 
{ 
    /// do whatever you want here 
}).Start(); 

要小心,雖然 - 如果該服務被擊中很頻繁,你可能會風造就了不少,阻止對方的線程。