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

本文关键字:运行 函数 长时间 控制器 MVC 异步 | 更新日期: 2023-09-27 18:32:47

我正在使用 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。

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

提前感谢!

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

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

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

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

并运行它:

t.Start();
在我看来,在

ASP.NET 网站中为此生成一个新线程是不合适的。每个客户端请求都在 ISS 的一个线程中处理。

但是,如果该过程真的占用了Web服务器太多时间,我对此表示怀疑。您始终可以将实际工作委托给另一个系统。