在Asp.Net MVC控制器中运行异步方法的最佳解决方案?

时间:2017-12-20 07:45:19

标签: c# asp.net-mvc asynchronous

我很困惑,哪种方法对我来说是最好的解决方案。

我有一个控制器调用方法' PostEventEmailMessage'在我打电话的方法里面

// do some work
var queueClient = QueueClient.CreateFromConnectionString(serviceBusConnectionString, queueName);
var sequenceToCancel = queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail);
queueClient.CloseAsync(); 
// do remaining work

我真的很困惑,下面哪种方法最适合同步运行,或者在Asp.Net MVC中是否有更好的解决方案?根据我引用的链接,似乎前两个选项存在死锁问题。

  

Calling async method synchronously

     

How would I run an async Task<T> method synchronously?

我应该使用吗? 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);
}
然后是&#39; SaveSpaceEvent&#39;方法看起来像这样

public void SaveSpaceEvent(Details, details) {
    // do some stuff
    _messageService.PostEventEmailMessage(details)
    // do more stuff
}

并在&#39; PostEventEmailMessage&#39;

中调用异步队列消息

1 个答案:

答案 0 :(得分:1)

为什么你想同步调用这个方法?使控制器操作为异步,并使用await调用方法:

public async Task<ActionResult> SomeAction()
{
    // ...
    var sequenceToCancel = await queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail);
    // ...
}
相关问题