c# - Windows 应用程序在使用后台工作进程时被挂起

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

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

我的一位 friend 建议使用“可以”显示类似“请稍候...正在发送电子邮件”之类的消息的后台工作程序。我不知道如何使用后台工作进程。请指导我

或者,如果有任何其他更快/更简单的选择,我将不胜感激

最佳答案

您不想使用单独的进程 - 您想要使用不同的线程

发送电子邮件的工作不应该在 UI 线程中完成,因为那样会阻止它更新。但是,您可能希望在发送电子邮件时禁用部分用户界面,具体取决于您的应用。

当谈到在后台处理电子邮件时,您可以明确地创建一个新线程,使用线程池,或者创建一个 BackgroundWorker .您可能想使用 Control.InvokeControl.BeginInvoke在发送电子邮件后将委托(delegate)调用编码回 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
}

关于c# - Windows 应用程序在使用后台工作进程时被挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235877/

相关文章:

c# - 使用作为公共(public)依赖项的私有(private)静态字段对静态类进行单元测试

c# - 上传HTTP进度跟踪

c# - 通过 ID 列表在数据库中搜索记录

c# - 立即显示启动画面

c# - SQL 从查询中检测无效的列名

c# - 如何序列化到现有文件?

c# - 在 windows phone 8.1 后台播放声音

asp.net - 大型 Web 应用程序有哪些可能的架构选项

javascript - Ajax CollapsiblePanelExtender 在回发时保持状态

c# - 带有客户端证书的 WCF 应用程序在一段时间后失败?