【发布时间】:2017-12-20 07:45:19
【问题描述】:
我也很困惑哪种方法对我来说是最好的解决方案。
我有一个控制器,它调用方法“PostEventEmailMessage”并在我调用的方法内部
// do some work
var queueClient = QueueClient.CreateFromConnectionString(serviceBusConnectionString, queueName);
var sequenceToCancel = queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail);
queueClient.CloseAsync();
// do remaining work
我真正感到困惑的是,下面哪种方法最适合使其同步运行,或者在 Asp.Net MVC 中是否有更好的解决方案?根据我引用的链接,前两个选项似乎有死锁问题。
我应该使用 1.
var sequenceToCancel = queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail).GetAwaiter().GetResult();
2.
var sequenceToCancel = queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail).Result;
3.
var sequenceToCancel = Task.Run(() => queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail)).Result;
我的控制器看起来像这样
public ActionResult SaveSpaceEvent(Details details) {
_spaceservice.SaveSpaceEvent(details);
}
那么'SaveSpaceEvent'方法看起来像这样
public void SaveSpaceEvent(Details, details) {
// do some stuff
_messageService.PostEventEmailMessage(details)
// do more stuff
}
并且在“PostEventEmailMessage”中调用异步队列消息
【问题讨论】:
-
你应该阅读Stephen Cleary‘s blog ;o)
-
你能推荐一个他发的具体帖子吗,有很多!
-
所有异步博客文章都值得一读,但你可以先从Don't Block on Async Code开始
标签: c# asp.net-mvc asynchronous