簡體   English   中英

使用后台工作進程時,Windows應用程序被掛起

[英]Windows Application gets hanged when using a background worker process

在我的應用程序中,我發送更大尺寸(> 2.5 Mb)的電子郵件。 現在直到發送電子郵件,應用程序處於掛起狀態(鼠標光標處於忙碌狀態)。

我的一位朋友建議使用后台工作人員“可以”顯示“請稍候......發送電子郵件”等消息。 我不知道如何使用后台工作進程。 請指導我

或者,如果有任何其他更快/更容易的替代方案,我會很感激輸入

您不想使用單獨的進程 - 您希望使用其他線程

發送電子郵件的工作不應該在UI線程中完成,因為這會阻止它更新。 但是,您可能希望在發送電子郵件時禁用部分UI,具體取決於您的應用。

在后台進行電子郵件工作時,您可以顯式創建新線程,使用線程池或創建BackgroundWorker 您可能希望使用Control.InvokeControl.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

http://www.dotnetperls.com/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM