在我的ASP.NET MVC Web应用程序中,我正在使用一个有时可能需要很长时间才能响应的Web服务。在这种情况下,用户可能想要取消请求并能够提出其他请求。但是,由于服务器仍在忙于处理先前的请求,用户必须等到该请求完成。出于这个原因,我决定做一些执行密集IO作业异步的操作方法,希望主线程不会被阻塞。但是这并没有帮助。这是我的方法:请求可以在单独的线程上处理吗?
1:public class TestController:AsyncController{
2: public async Task<ActionResult> GetString(){
3:
4: string data=await Task<string>.Factory.StartNew(()=>{
5: return service.GetDataAsString("name");
6: });
7: return View(data);
8: }
9:}
第7行将不会执行,除非服务返回期望的字符串,所以仍然阻塞仍然存在。我需要做什么才能使整个行动在单独的线程中进行?我必须走旧时尚吗?这种事情不是异步方法吗?
可能是你看错了方向。什么可能会导致你的问题,会话锁。尝试禁用它,装饰控制器的下一个属性:[SessionState(SessionStateBehavior.Disabled)] – Uriil
这显然会禁用会议状态,这不是我想要的。如果这是唯一的方法,那么这意味着我必须牺牲两者之一:会话或用户体验。我对么? –
@MikeJM - 我想你以后是火与忘记。或者,您可以将您的操作分为两个操作(一个返回视图,另一个执行服务调用)并从客户端执行两个单独的请求。 – heymega