[英]Windows Application gets hanged when using a background worker process
在我的應用程序中,我發送更大尺寸(> 2.5 Mb)的電子郵件。 現在直到發送電子郵件,應用程序處於掛起狀態(鼠標光標處於忙碌狀態)。
我的一位朋友建議使用后台工作人員“可以”顯示“請稍候......發送電子郵件”等消息。 我不知道如何使用后台工作進程。 請指導我
或者,如果有任何其他更快/更容易的替代方案,我會很感激輸入
您不想使用單獨的進程 - 您希望使用其他線程 。
發送電子郵件的工作不應該在UI線程中完成,因為這會阻止它更新。 但是,您可能希望在發送電子郵件時禁用部分UI,具體取決於您的應用。
在后台進行電子郵件工作時,您可以顯式創建新線程,使用線程池或創建BackgroundWorker
。 您可能希望使用Control.Invoke
或Control.BeginInvoke
在發送電子郵件時將委托調用封送回UI線程。 就個人而言,我可能會直接使用一個線程 - 聽起來它需要一段合理的時間,而我的猜測是你將無法報告有意義的進展(這是BackgroundWorker
變得容易的主要任務)。 編輯:根據評論, BackgroundWorker
還會對UI線程的異常進行編組,您可能會發現它很有用。
所以類似於:
public void SendEmailButtonClicked(object sender, EventArgs e)
{
// Make any changes to the UI here to disable whatever you want
new Thread(SendEmail).Start();
}
private void SendEmail()
{
// Do the sending of the email here (this is in the non-UI thread)
// Then afterwards, possibly in a finally block
Action action = EmailSent;
this.BeginInvoke(action);
}
private void EmailSent()
{
// Back in the UI thread, do whatever you need to indicate
// success/failure, re-enable disabled parts of the UI etc
}
BackgroundWorker
文檔包含一些非常好的示例,這些示例應該有助於您入門。
背景工作者是完美的。 它允許您非常輕松地監視進度,並且可以比標准線程更容易地回到UI線程。 google fu之后的一些鏈接:
http://justins-fat-tire.blogspot.com/2010/05/c-using-background-worker.html
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
我會嘗試使用BackgroundWorker
控件。 請參閱以下鏈接
如果您不希望在等待長進程時掛起UI,則必須使用線程。 BackgroundWorker
是一個很好的實現,它提供了用於報告進度的鈎子,允許用戶中止進程等。
Stack Overflow上有很多關於BackgroundWorker
的問題或查看MSDN文檔 。
看看這個線程教程: http : //msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx
基本的想法是讓你的鼠標點擊事件產生一個新線程,負責發送電子郵件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.