【发布时间】:2016-03-21 09:19:46
【问题描述】:
考虑简单的 MVC5 控制器:
public class DocumentsController {
// ctor code is omitted
[HttpPost, Route("api/documents/request/stamp={stamp}")]
public ActionResult RequestDocuments(string stamp) {
var documents = this.DocumentsRequestService.RequestByStamp(stamp);
return new JsonResult(documents);
}
}
DocumentsRequestService 在内部做这些事情:
-
它向一个专用的MSMQ-queue发送一个请求(我们称之为M)并且同步在M 的响应队列:
using(var requestMessage = new Message()) { requestMessage.Body = documentStamp; requestMessage.Recoverable = true; requestMessage.Label = "request"; requestMessage.ResponseQueue = this.requestedDocumentsResponseQueue; requestMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) }); // send request this.requestedDocumentsQueue.Send(requestMessage); // synchronously wait for response var responseMessage = this.requestedDocumentsResponseQueue.Receive(); if(responseMessage.Label.EndsWith("success")) { return new DocumentsRequestResult( success: true, matches: parseMatchesList(responseMessage) ); } return new DocumentsRequestResult( success: false, matches: Enumerable.Empty<DocumentsRequestMatch>() ); } 该消息的使用者(Windows 服务)进行特定的 api 调用。通过说“具体”,我的意思是我们使用第三方手段来做到这一点。这个调用是同步的并且相当长。当处理结束时,消费者会向请求消息的响应队列发送响应消息。
- 当响应到达 M 的响应队列时,是时候解析并将结果返回给控制器了。
从最终用户的角度来看,这个任务应该是阻塞的,或者至少看起来应该是阻塞的。
据我了解,运行 Task 会利用并行化。而使用 async-await 对使正在运行的任务异步。如果多个任务并行运行会很有帮助。
在我的情况下与 Tasking/Asynchrony 结合是否合理/可能?如果是,那我从哪里开始?
【问题讨论】:
标签: c# multithreading asynchronous task-parallel-library msmq