异步或并行功能

本文关键字:功能 并行 异步 | 更新日期: 2023-09-27 18:30:25

我正在开发一个应用程序(ASP.NET MVC5),它可以一次性将一堆数据保存到数据库中。保存数据的方法需要时间来做到这一点,我不想阻止用户界面。

在这里,我

创建了一个将休眠 10 秒的测试程序,我不想从该程序返回任何结果。

public Task SaveFunc()
{
    Thread.Sleep(10000);
    return null;
}
public void ShowFunction()
{
SaveFunc();
retrun "Your request is under process";
}

现在,我如何以这样一种方式调用 SaveFunc,这样我就不必等待结果。

异步或并行功能

您应该

Task.Delay使用异步方法,因为Thead.Sleep是同步的并且阻止当前上下文。您还需要从方法返回Task而不是null,并等待Task等待它结束。同时,您的程序可以按原样运行:

public Task SaveFunc()
{
    return Task.Delay(10000);
}
public async void ShowFunction()
{
    await SaveFunc().ConfigureAwait(false);
}

此答案假设您正在使用ASP.NET MVC - 如果不是这种情况,请更新您的问题:

从 .NET 4.5.2 开始,您可以执行以下操作:

public ActionResult ShowFunction()
{
    HostingEnvironment.QueueBackgroundWorkItem(cancellationToken =>
    {
        // Some long-running job
    });
    return Content("Your request is under process");
}

如果您仍在使用旧的 .NET 版本,则可以执行以下操作:

public ActionResult ShowFunction()
{
    ThreadPool.QueueUserWorkItem(c =>
    {
        // Some long-running job
    });
    return Content("Your request is under process");
}

但是,应用程序域回收可以取消ThreadPool.QueueUserWorkItem的执行,因此您需要处理此类情况。从 .NET 4.0 开始,您还可以使用Task.Factory.StartNew(() => { /*...*/ });并获取要使用的Task