在MVC控制器中异步运行长时间运行的函数

时间:2013-09-26 06:36:34

标签: c# multithreading asp.net-mvc-4

我正在使用Asp.net MVC 4,当用户点击页面上的链接时,我正在尝试在后台运行一个函数。

我搜索过并搜索过,我无法弄清楚该怎么做。

我试图运行的函数是PhoneNumbersController内的一个函数,它不会返回任何内容,它只是做了很多工作。

基本上,用户输入一个电话号码列表(数量非常大),然后点击go。

然后,服务器会将所有这些电话号码保存到数据库中。然后我希望服务器运行类似这样的函数:

    Foo(int accountId)
    {
        var account = GetAccountById(accountId);

        while (account.IsRunning)
        {
            var Number = (from n in account.PhoneNumbers
                          where n.Status = "new"
                          select n).FirstOrDefault();
            // Do some work on Number.

            Thread.Sleep(1000); // I'm working with an API that limits you to 1 per second.

            account = GetAccountById(accountId);
        }
    }

我知道,这段代码很糟糕,但这仅仅是为了展示一个例子。

我将要运行可能至少100,000个数字,所以我们必须能够暂停和恢复它(因此是while(IsRunning)变量。我有一个暂停函数,将该值设置为false。

作为以前从未使用过异步请求或多线程的人,这里最好的选择是什么,我将如何解决这个问题?

提前致谢!

2 个答案:

答案 0 :(得分:1)

编辑:阅读下面的评论,这个解决方案似乎只适用于短任务,因为应用程序池可能会杀死创建的线程

您可以简单地创建一个后台线程:

var t = new System.Threading.Thread(() => Foo(yourAccountId)) {IsBackground= true};

运行它:

t.Start();

答案 1 :(得分:0)

在我看来,在ASP.NET网站中为此生成一个新线程并不是一件好事。每个客户端请求都在ISS的一个主题中处理。

然而,如果这个过程真的花了太多时间远离Web服务器,我怀疑。您总是可以将实际工作委托给另一个系统。