2015-05-27 66 views
0

在我的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行将不会执行,除非服务返回期望的字符串,所以仍然阻塞仍然存在。我需要做什么才能使整个行动在单独的线程中进行?我必须走旧时尚吗?这种事情不是异步方法吗?

+1

可能是你看错了方向。什么可能会导致你的问题,会话锁。尝试禁用它,装饰控制器的下一个属性:[SessionState(SessionStateBehavior.Disabled)] – Uriil

+0

这显然会禁用会议状态,这不是我想要的。如果这是唯一的方法,那么这意味着我必须牺牲两者之一:会话或用户体验。我对么? –

+1

@MikeJM - 我想你以后是火与忘记。或者,您可以将您的操作分为两个操作(一个返回视图,另一个执行服务调用)并从客户端执行两个单独的请求。 – heymega

回答

2

这是不是异步方法的意思吗?

不,async不会更改HTTP协议。您每个请求仍然只有一个响应,并且该响应只能发送一次。

async腾出调用线程,但在ASP.NET这只是意味着该线程返回线程池,并能处理其他请求;它不会向用户发送HTTP响应。在你的特定情况下,代码首先从线程池(StartNew)获取一个线程,以释放线程池中的线程(await),这是毫无意义的。

有几个解决方案应该工作。您可以删除会话状态或将此呼叫替换为SignalR集线器(允许其他用户请求在旧节点完成时),也可以使用AJAX样式 - 最好使用reliable queue connected to an independent worker process

相关问题