【问题标题】:What's the Current and Recommended Way to Fire Off an Asynchronous Thread?当前和推荐的触发异步线程的方法是什么?
【发布时间】:2011-07-24 21:54:00
【问题描述】:

我有一个 ASP.NET MVC 3 (.NET 4) Web 应用程序。

我有一个[HttpPost] 操作方法,可以将一些数据提交到数据库。

现在,在此方法完成对存储库的持久化后,我希望执行“后台”任务(考虑审核或发送电子邮件等),我不关心结果(除非发生错误,在这种情况下,我将执行日志记录)。

我如何/应该如何从我的操作方法中触发此任务?

[HttpPost]
[Authorize]
public ActionResult Create(MyViewModel model)
{
   if (ModelState.IsValid)
   {
      _repo.Save(model); 
      // TODO: Fire off thread
      return RedirectToRoute("Somepage", new { id = model.id });
   }
   return View(model);
}

【问题讨论】:

标签: c# multithreading asp.net-mvc-3 .net-4.0 threadpool


【解决方案1】:
// Fire off thread
var t = new System.Threading.Thread(() =>
{
   // do whatever
});
t.Start();

在“做任何事情”中,您应该使用 try/catch 记录任何异常。

【讨论】:

    【解决方案2】:

    新的 .NET 4 方法是使用 Task

    http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx

    Task.Factory.StartNew(MyBackgroundAction);
    

    但是对于这个你只想运行它而不关心协调任务的简单操作,使用线程池同样容易。

    ThreadPool.QueueUserWorkItem(MyBackgroundAction)
    

    您希望避免自己为每个操作创建一个新线程 - 这会占用更多资源并且是不必要的浪费。

    如果您的后台任务运行时间较长,您可能需要设置一个生产者/消费者队列,并拥有一个或一组持续运行的后台线程来运行任务。

    【讨论】:

    • 感谢您的回答。一个澄清 - “你想避免自己为每个动作创建一个新线程 - 它会占用更多资源并且不必要地浪费” - 我还能怎么做?那我在哪里创建新线程呢?例如,我应该在哪里拨打 ThreadPool.QueueUserWorkItem(MyBackgroundAction) 电话?
    • @RPM1984 使用 QueueUserWorkItem 意味着任务将由已经是 ASP.Net 线程池一部分的线程完成。这些线程不断地消耗队列中的任务并完成它们,您可以从代码中的任何位置将新任务排入队列。但是,这在我的回答中链接的 ASP.Net 中有很大的缺点。
    • @Chris - 感谢您的帮助和回答。问题是,这是一个(相对)简单的应用程序,没有巨大的流量或并发用户。过去(版本 1),我们使用 Thread.Start 并没问题。所以我想我会选择ThreadPool.QueueUserWorkItem
    【解决方案3】:

    一般是ill-advised to use the Thread Pool in ASP.Net 用于异步任务。

    注意这个问题是在here上触及的,虽然我不同意这个答案。接受的答案假设您需要现在完成工作,而对于此问题所描述的异步任务,以后可以轻松完成。这允许处理分布在更长的时间段内,这在负载不均匀时很有用(就像大多数网页一样)。

    为每个请求生成线程也不是最理想的,因为没有简单的方法来限制创建的线程数。 100 个衍生任务将与您的 Web 应用程序竞争,以尝试“实时”工作。

    使用消息系统来管理不需要立即运行的异步任务。每个要处理的请求都作为消息发送,该消息排队等待稍后处理。然后,您可以在本地系统上拥有一个单独的应用程序,或者如果这些任务需要在其他机器上进行大量处理。您也可以轻松地分散这些任务的负载,方法是在多台机器上运行处理器,这些机器都从同一个队列中拉取数据。

    过去我使用MSMQ效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-05
      • 2011-01-20
      • 2023-02-05
      • 2016-06-13
      • 2021-09-04
      • 2015-08-22
      • 2015-01-10
      • 2018-03-27
      相关资源
      最近更新 更多