【问题标题】:How to use threading to call a repetitive process in .NET?如何使用线程调用.NET 中的重复进程?
【发布时间】:2011-01-22 13:01:46
【问题描述】:

在我的网站中,我需要执行不应该影响网站主要活动和性能的重复性任务。

所以我认为我需要使用线程。我是.Net 中的线程新手。 .NET是如何使用线程的?

任何教程或任何文章的参考都会有很大帮助。

【问题讨论】:

  • 您可以通过在 Asp.Net 网站中使用线程来完成此操作,但为后台进程创建单独的 Windows 服务可能会容易得多。
  • (给读者的一般说明:我从这个旧问题中删除了对资源/教程的请求,因为这种问题是题外话,但我改变了主意,因为接受的答案只是链接列表。如果今天提出这个问题,该问题将被关闭,但由于其年代久远,它可能会逃脱社区审核)。

标签: .net asp.net multithreading


【解决方案1】:

这里有一个很棒的教程,教你如何使用multi-threaded applications in .NET 在另一个线程上完成工作的简单方法是使用BackgroundWorker

当通过网络在其他线程上处理繁重的任务时,您可能希望使用 Ajax 发起请求,然后“轮询”以获得答案。

在MSDN上面有一篇文章:Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code,有点老了,但我想你可以通过阅读获得基本的了解。

【讨论】:

  • 第一个链接(www.yoda.arachsys.com)产生 404。您要修复还是删除?
【解决方案2】:

在 ASP.NET 应用程序中执行此操作的正确方法是使用 HostingEnvironment.QueueBackgroundWorkItem。这样可以确保后台任务在 IIS 应用程序被回收、机器关闭或类似情况时正常关闭。

在应用程序启动时调用一次:

HostingEnvironment.QueueBackgroundWorkItem(RunInBackground);

然后实现这样的方法:

private async Task RunInBackground(CancellationToken cancellationToken)
{
    while (!cancellationToken.IsCancellationRequested)
    {
        // Repetetive task

        await Task.Delay(TimeSpan.FromMinutes(1));
    }
}

您也可以使用HostingEnvironment.RegisterObject 并手动执行更多操作。您将获得一些控制权,但不会那么简单。

【讨论】:

    【解决方案3】:

    在 .NET 中使用多线程有不同的方法。 如前所述,您可以使用 BackgroundWorker,但也可以使用 Task based Asynchronous Programming,这是推荐的方式,因为 TPL 在 .NET 中可用

    这意味着您可以像这样简单地卸载需要在另一个线程上完成的工作

    Task.Factory.StartNew(() => DoSomeWork());
    

    This Stephen Cleary 的文章也很有趣。它将 BackGroundWorker 与 TPL 进行比较。

    另外,请记住,如果您在 asp.net 中执行长时间运行的任务,您的请求可能需要很长时间才能完成。在另一个服务中执行长时间运行的任务可能会更好,例如Hangfire

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多