异步或并行功能
本文关键字:功能 并行 异步 | 更新日期: 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
。