【问题标题】:Async/Await Cancellation异步/等待取消
【发布时间】:2014-08-04 19:20:18
【问题描述】:

在 MVC 操作方法中给出以下代码:

    public async Task<PartialViewResult> PatientFilterAll(PatientFilterQuery patientFilterQuery)
    {
        int count = await Task.Run(() => _patientService.GetAllPatientsCount(patientFilterQuery));

        IList<PatientDTO> patients = await Task.Run(() => GetPatientList(patientFilterQuery));

        Cookie.Set("RecordCount", Convert.ToString(count));

        return PartialView("List", patients);
    }

PatientFilterQuery 是一组带有搜索条件的下拉框。首先为客户端分页请求总计数,然后是搜索条件。

如果在发出请求后更改下拉菜单,则会生成对 Action 方法的新请求。结果有时是原始请求得到满足,几秒钟后第二个请求得到响应。

如何停止第一个请求而只返回第二个请求?

【问题讨论】:

  • 您无法在服务器上控制它。真正的问题听起来是为什么会有两个客户端请求?为什么第一个客户端请求没有中止(jQuery?)?
  • 你不能忍受第二个请求覆盖第一个请求返回的内容吗?
  • 第一个请求在页面加载中并且包含默认条件。有时用户会在下拉菜单中进行选择以进行更窄的搜索。
  • 效果是默认搜索显示在列表中,稍后再更改。如果我可以停止第一个返回的列表,那就更好了。此外,搜索运行时间很长,因此用户认为第一个结果是正确的,然后在五到八秒后看到它发生变化。
  • 你是如何从客户端触发的?

标签: c# asp.net-mvc asynchronous


【解决方案1】:
  • 您需要彻底改变异步设计。使用Task.Run 方法并不意味着它是一个异步操作。 more info
  • 如果您使用的是 ADO.NET 或 EF,它们有一组新的 real 异步方法,根本不需要 Task.Runmore info
  • 异步操作方法可以有一个CancellationToken 参数。 more info

【讨论】:

  • 这根本不能回答问题。
  • 好吧,至少它说明了一个更大的问题,这是一个不必要的Task.Run
  • 感谢异步信息。我一定会仔细审查的。
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多