【问题标题】:Async in MVCMVC 中的异步
【发布时间】:2009-04-18 23:40:19
【问题描述】:

我有这个网络服务正在吸收有关汇率的数据,我的问题是它需要很长时间才能加载。所以我想异步加载数据,但是当我调用 GetRatesASync() 方法时,它说

“在此上下文中不允许异步操作。启动异步操作的页面必须将 Async 属性设置为 true,并且只能在 PreRenderComplete 事件之前的页面上启动异步操作。”

哦,顺便说一句,我使用了一个肥皂服务和一个 MVC UserControl,如果这有帮助的话,我将 GetRatesASync() 方法放在受保护的覆盖 void OnPreRender(EventArgs e) 中。 那么我如何在页面加载后使用 jquery 获取这些血腥数据异步。 有没有办法让这个获取数据的事情变得更快

【问题讨论】:

  • 请问您为什么要使用 SOAP?如果您已经在使用 JQuery 来获取结果,为什么不直接使用一个 ActionResult 来返回例如一个 JSON 对象,或者您正在使用的 MVC UserControl? MVC 框架为处理部分回发提供了强大的支持...
  • 我认为异步获取数据不会对您有所帮助(OnPreRender 无论如何都是服务器端事件)。你能缓存汇率吗?
  • @James Avery 无法访问主机不允许 @Thomas 我也在调查这一点

标签: asp.net-mvc web-services asynchronous


【解决方案1】:

如果你想在 MVC 中实现异步,你可以使用 AsyncController included in ASP.NET MVC Futures

但是异步操作不会让你的网络服务更快......它只会阻止它阻塞你的线程。

【讨论】:

  • 异步操作会比同步操作快。同步操作总是会产生一点点开销。还要检查msdn.microsoft.com/en-us/library/ms734701.aspx
  • @Silvermind :它可以每秒给你更多请求,这更快是一回事.它是有开销的异步(例如它破坏了局部性)。
  • 我的立场是正确的。但除此之外,我更喜欢异步 Web 服务中的事件,它为我提供了更清晰的代码,FaultExceptions 在 EventArgs 中。但是我误读了异步的开销。
【解决方案2】:

使用jquery,如何:1)等待页面在浏览器中加载; 2)调用一个对服务器进行异步调用的javascript函数; 3)等待结果; 4)当结果从服务器到达时,在浏览器中显示?

类似:

网页中的Javascript/jquery:

$().ready(GetExchangeRates);
function GetExchangeRates()
{
    // TODO: Maybe show a *loading* animation.
    $.get("/Currency/GetExchangeRates",
        null, GetExchangeRatesCompleted, "json");
}
function GetExchangeRatesCompleted(result)
{
    // TODO: Hide *loading* animation.
    // TODO: Display result on page.
}

控制器动作(C#):

public class CurrencyController : Controller
{
    public JsonResult GetExchangeRates()
    {
        var exchangeRates = _slowWebService.GetExchangeRates();
        return Json(exchangeRates);
    }
}

另一件事:

如果您无法缓存汇率,如何将它们保存在 App_Data 文件夹中的 xml 文件中,其中包含一个条目,说明上次从慢速 Web 服务检索汇率的时间,然后刷新该 xml 文件它早于某个指定的时间间隔?

【讨论】:

    【解决方案3】:

    这是一个没有 AsyncController 但使用 TPL 任务的更简单的代码

     public async Task<ActionResult> Index() 
        {
          var exchangeRates = await _slowWebService.GetExchangeRates(); // this method should return Task<IEnumerable<ExchangeRate>>
            return Json(exchangeRates);
    
        return View(result);
        }
    

    查看此视频mvc4 and tpl task action methods

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2012-10-29
      相关资源
      最近更新 更多