【问题标题】:SmtpClient.SendAsync - Stop application after the callSmtpClient.SendAsync - 调用后停止应用程序
【发布时间】:2015-02-24 17:01:01
【问题描述】:

我正在构建必须发送电子邮件的 winforms 应用程序。我希望能够调用 SmtpClient.SendAsync 方法,然后允许用户立即关闭应用程序(我对在回调函数中获取发送结果不感兴趣)。如果用户停止应用程序,则不会发送电子邮件....如果应用程序保持运行,则按预期发送电子邮件... 有什么建议,我如何将所有相关详细信息传递给 smtp 服务器并关闭我的应用程序?

谢谢

【问题讨论】:

  • 这不是它的工作方式,这不是任何工作的方式......异步并不意味着 “我对结果不感兴趣” 也不是 “即使我终止了我的应用程序,也要继续这样做” 并发送电子邮件包括与 SMTP 服务器通信并保持打开连接,直到发送整个消息 - 对于每条消息。这需要时间,而且您要发送的消息越多,时间越长。如果您想要并且能够将消息排入队列,您可能需要考虑将实际发送任务卸载到 Windows 服务。
  • 或者(除了 CodeCaster 所说的)将执行派生到一个单独的进程。
  • 我理解你的意思,你建议将发送逻辑替换为Windows服务,并从我的winforms应用程序中调用它?
  • @Lev 是的,这就是我的建议。 :)
  • 各位,非常感谢您的帮助和建议

标签: c# winforms smtpclient


【解决方案1】:

您的操作需要被允许执行,直到发送到 SMTP 服务器完成。如果你真的不关心结果,你可以产生一个前台线程来执行传递。这样,如果用户关闭应用程序,它的 GUI 将被卸载,但前台线程将持续到操作完成。一旦属于该进程的所有前台线程都已终止,该进程本身也将终止。

var t = new Thread(new ThreadStart(() => smtpClient.Send(message)));
t.IsBackground = false;
t.Start();

编辑:正如 CodeCaster 所指出的,这种方法假定您的应用程序的进程将在用户关闭其窗口后继续运行。如果用户在线程完成之前关闭系统(或手动终止进程),操作将失败。

【讨论】:

  • 然后用户关闭他们的计算机,或者 OP 收到投诉,他们的应用程序在关闭后继续运行。并不是说这不是解决方案,只是指出一些缺点。
  • @CodeCaster:有效积分。无论如何,我认为这是一种“尽力而为”的尝试,因为用户并不关心结果。
  • 非常感谢!您的回答 100% 符合我的需求。
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多