【发布时间】:2012-02-23 10:36:37
【问题描述】:
我有一个网络表单,我在其中使用 TPL 在后台发送电子邮件,因为我们的 SMTP 服务器速度很慢,而且许多用户最终因为沮丧而敲打提交按钮。过去我曾使用System.Threading 和静态方法来完成类似的任务 - 在 .NET3.5 中,我的代码如下所示:
Thread t = new Thread(new ParameterizedThreadStart(SendEmail));
t.Start(txtEmail.Text);
SendEmail 的签名是public static void AddEmailToMailingListInBackground(object EmailString),我记得该方法必须是静态的,并且我必须将 TextBox txtEmail 的值传递给异步方法,否则在页面生命周期独立继续时可能会失去对控件值的访问权限.
现在使用System.Threading.Tasks 时,我的代码如下所示:
Task.Factory.StartNew(() => SendEmail(), TaskCreationOptions.LongRunning);
SendEmail 的签名是private void SendEmail(),我直接在该方法中访问txtEmail 的Text 属性。
我在这里看到两个主要区别。首先,我的异步方法不再必须是静态的。其次,如果我使用线程,我可以在页面的生命周期完成很久之后在方法中访问页面的控制值。这两点让我相信页面一直保持活动状态,直到所有任务完成或页面生命周期完成,以最后发生者为准。我已经通过调试和单步执行异步方法对此进行了测试——响应被发送到浏览器,但我仍然能够单步执行并访问控件及其值。 This MSDN article 有一点帮助,但仍然不能真正巩固我对 TPL 与 pre-.NET4 执行异步调用的方式的理解。
谁能告诉我我的想法是否正确并且在将 TPL 与 ASP.NET 一起使用时这是可靠的行为吗?
有人愿意详细说明吗?
【问题讨论】:
标签: asp.net asynchronous asp.net-4.0 task-parallel-library