2012-04-24 54 views
1

我還沒有使用asp.net的多線程。我有一個Web應用程序,可以將大型臨時文件上傳到文件夾。我想在臨時文件上傳後使用臨時文件並執行其他操作。我可以在另一個線程上做這項工作,而用戶不在網站上嗎?感謝您的任何幫助或建議。asp.net上的多線程

1.用戶張貼大文件 2.上傳temp到服務器 3.上傳完成後。我想運行另一個線程/工作器,它可以在沒有任何用戶迭代的情況下運行,但由用戶觸發。

void uploading(){ 
//Uploading file To server 
} 
void Submitclick(){ 
Start a Thread 
Thread thread = new Thread(DoThreadWork);// does the user still need to be logged in? 
Send to another page 
} 
void DoThreadWork(){Do this in background} 
+0

我會[建議你避免這個](http://stackoverflow.com/questions/5553001/how-should-i-perform-a-long-running-task-in-asp-net-4/5553048# 5553048)。 – 2012-04-24 08:26:17

回答

8

這絕對有可能,我在ASP.NET中使用了很多後臺線程來做一些時髦的事情。如果您完全控制了服務器,那麼在單獨的應用程序或Windows服務中運行後臺代碼可能會更優雅。

這是一個更好的分離問題,讓您的IIS應用程序只處理Web請求,並且不會爲此做好準備。

也警告,如果你在ASP.NET 2.0中的後臺線程,它有未處理的異常,則默認爲重置應用程序池。

點擊此處瞭解詳情:http://blogs.msdn.com/b/tess/archive/2006/04/27/584927.aspx

// 3個downvotes?

聽着,它不可能避免在後臺線程中運行某些東西。我已經在幾種情況下打這個:

  • 我在一個公司的無理態度,軟件 我們不允許部署一個單獨的應用程序來處理 後臺處理工作。我主張一個Windows服務,但被推翻並被告知在後臺線程中實現它。很顯然 我從那家公司搬到了一個更健康的環境,但那是 實際情況是,你必須有時處理不合理的情況 。
  • 如果您處於託管環境中,您並不總是可以選擇卸載到單獨的進程。

的問題是,如果它是可能的。我正在回答這個問題。

+2

看起來像一個苛刻的downvote?是否有可能:是的,但是你應該使用其他的東西,如果你注意未處理的異常。 – 2012-04-24 08:30:05

-1

您可以使用該線程池。示例代碼依賴於文章中的以下LIK:http://msdn.microsoft.com/en-us/library/3dasc8as(v=vs.80).aspx

先寫你的方法,做的工作。該方法必須獲得對象的類型1個參數:

public void DoWork(object threadContext) 
{ 
} 

比,因爲你要調用的方法的代碼的地方做:

... 
var threadParam = ... // Put any value you want to be used by the DoWork method 
ThreadPool.QueueUserWorkItem(DoWork, threadParam); 

的方法將在排隊,直到系統會hav free thread來處理工作並執行方法,無論請求是否已經結束。

+0

在ASP.NET網站上使用後臺處理的一個警告。 IIS可以在任何特定時刻回收應用程序,並在執行此操作時終止任何正在運行的後臺線程。所以不能保證你的線程池線程能夠成功運行。如果這是個問題,最好使用Windows服務來進行後臺處理。 – Steven 2012-04-24 08:13:42

+0

在應用程序池回收之前,應用程序將收到一個事件,可以使用Global.asax Application_End方法捕獲該事件。在這種方法中,您可以進行必要的檢查並處理正在運行的線程(由於您需要與正在運行的線程進行通信,因此您的代碼將變得稍微複雜一些)。 – 2012-04-24 08:21:19

0

如果你想文件的上傳,從網站用戶交互分開就可以使一個窗口服務,將contineously檢查,如果文件準備上傳,上傳的文件。

+1

而不是連續檢查您是否可以在服務準備就緒時向服務器發送消息 – 2012-04-24 08:13:30

+0

是的,通過進程間調用不是嗎? – Adil 2012-04-24 08:46:42

+0

最簡單的方法之一是調用Windows服務託管的WCF服務。 – 2012-04-24 08:52:02