我正在开发一个应用程序(ASP.NET MVC5),它可以一次性将一堆数据保存到数据库中。保存数据的方法需要时间,我不想阻止用户界面。
这里我创建了一个测试程序,它将睡眠10秒,我不想从该程序中返回任何结果。
public Task SaveFunc()
{
Thread.Sleep(10000);
return null;
}
public void ShowFunction()
{
SaveFunc();
retrun "Your request is under process";
}
现在,我如何调用SaveFunc,以便我不必等待结果。
答案 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);
}