【问题标题】:Best solution for running a asynchronous method in Asp.Net MVC controller?在 Asp.Net MVC 控制器中运行异步方法的最佳解决方案?
【发布时间】: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 中是否有更好的解决方案?根据我引用的链接,前两个选项似乎有死锁问题。

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);
}

那么'SaveSpaceEvent'方法看起来像这样

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

并且在“PostEventEmailMessage”中调用异步队列消息

【问题讨论】:

标签: c# asp.net-mvc asynchronous


【解决方案1】:

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

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

【讨论】:

  • 嗨 CodeFuller。我不知道这是否有意义,但我需要在模态窗口中用消息响应用户。在一切都完成之前我无法回复!或者我应该说,我需要能够根据结果来响应成功或错误。
  • 不确定这与我的回答有何关系。使动作异步不会改变功能行为。当调用await 时,直到等待的操作完成,流程才会继续。
  • 您的示例引发的异常“System.InvalidOperationException:此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果执行页面时发生此异常,请确保该页面标记为 。此异常也可能表示尝试调用“async void”方法,这在 ASP.NET 中通常不受支持请求处理。相反,异步方法应该返回一个任务,调用者应该等待它。"
  • 仅供参考 - 异步方法是从控制器操作方法调用的服务类方法中的方法调用的,而不是在控制器操作方法本身中调用
  • 那么您是否标记了您的控制器操作async 并返回Task&lt;ActionResult&gt;?如果您仍然遇到问题,请提供您的操作代码,小事在这里可能很重要。
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多