异步或并行功能

时间:2014-11-14 07:24:16

标签: c# asp.net-mvc asynchronous asp.net-mvc-5 async-await

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

这里我创建了一个测试程序,它将睡眠10秒,我不想从该程序中返回任何结果。

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

现在,我如何调用SaveFunc,以便我不必等待结果。

2 个答案:

答案 0 :(得分:0)

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

从.NET 4.5.2开始,您可以do the following

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的执行可以通过AppDomain-recycle取消,因此您需要处理此类情况。从.NET 4.0开始,您还可以使用Task.Factory.StartNew(() => { /*...*/ });并使用Task来处理。

答案 1 :(得分:0)

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

public Task SaveFunc()
{
    return Task.Delay(10000);
}

public async void ShowFunction()
{
    await SaveFunc().ConfigureAwait(false);
}