使用后台工作进程时,Windows应用程序被挂起

时间:2011-03-08 17:15:29

标签: c# asp.net winforms visual-studio multithreading

在我的应用程序中,我发送更大尺寸的电子邮件(> 2.5 Mb)。现在直到发送电子邮件,应用程序处于挂起状态(鼠标光标处于忙碌状态)。

我的一位朋友建议使用后台工作人员“可以”显示“请稍候......发送电子邮件”等消息。我不知道如何使用后台工作进程。请指导我

或者,如果还有其他更快捷/更容易的选择,我会很感激输入

6 个答案:

答案 0 :(得分:2)

您不想使用单独的进程 - 您想使用其他线程

发送电子邮件的工作不应该在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
}

答案 1 :(得分:1)

BackgroundWorker documentation包含一些非常好的示例,可以帮助您入门。

答案 2 :(得分:1)

后台工作人员非常适合这一点。它允许您非常轻松地监视进度,并且可以比标准线程更容易地回到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

答案 3 :(得分:0)

答案 4 :(得分:0)

如果您不想在等待漫长流程时挂起用户界面, 要使用线程。 BackgroundWorker是一个很好的实现,它提供了用于报告进度的钩子,允许用户中止进程等。

Stack Overflow上有很多关于BackgroundWorker的问题或查看MSDN documentation

答案 5 :(得分:0)

看看这个线程教程: http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx

基本的想法是让您的鼠标点击事件产生一个新线程,负责发送电子邮件。