在我的应用程序中,我发送更大尺寸的电子邮件(> 2.5 Mb)。现在直到发送电子邮件,应用程序处于挂起状态(鼠标光标处于忙碌状态)。
我的一位朋友建议使用后台工作人员“可以”显示“请稍候......发送电子邮件”等消息。我不知道如何使用后台工作进程。请指导我
或者,如果还有其他更快捷/更容易的选择,我会很感激输入
答案 0 :(得分:2)
您不想使用单独的进程 - 您想使用其他线程。
发送电子邮件的工作不应该在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
}
答案 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
答案 3 :(得分:0)
我会尝试使用BackgroundWorker
控件。请参阅以下链接
答案 4 :(得分:0)
如果您不想在等待漫长流程时挂起用户界面, 要使用线程。 BackgroundWorker
是一个很好的实现,它提供了用于报告进度的钩子,允许用户中止进程等。
Stack Overflow上有很多关于BackgroundWorker
的问题或查看MSDN documentation。
答案 5 :(得分:0)
看看这个线程教程: http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx
基本的想法是让您的鼠标点击事件产生一个新线程,负责发送电子邮件。