【问题标题】:ASP.NET MVC Controller actions -code runs chaoticallyASP.NET MVC 控制器操作 - 代码运行混乱
【发布时间】:2015-11-12 10:52:13
【问题描述】:

我真的不知道怎么问这个。我的控制器中有一组异步操作,其中一个应该通过 foreach 语句填充列表。奇怪的是,假设我有 10 行代码,它运行第 1 行,然后跳到第 4 行,然后跳到第 10 行,然后又跳到第 1 行,在某一时刻,列表包含它应该包含的所有项目,但随后又跳到第一个我声明该列表的行,然后它与空列表一起存在。谁能解释为什么会发生这种情况以及如何解决?

这是有问题的操作

[HttpGet]
public async Task<ActionResult> GetBuyingListItems(string buyingListId, string vendorId, string orderId)
{
    var buyingListService = new BuyingListService(_buyingListRepository);
    ItemService itemService = new ItemService(_itemRepository);
    var vendorService = new VendorService(_vendorRepository);
    om.BuyingList = await buyingListService.GetOne(buyingListId);
    om.BuyingListItems = await buyingListService.GetBuyingListItems(buyingListId);
    om.Vendor = await vendorService.GetOne(vendorId);
    om.ItemsList = new List<OrderItemsDTO>();
    foreach (var buyingListItem in om.BuyingListItems)
    {
        var item = await itemService.GetOne(buyingListItem.ItemId);
        var orderItem = new OrderItemsDTO();
        orderItem.OrderId = orderId;
        orderItem.ItemID = item.Id;
        orderItem.Qty = buyingListItem.Qty;
        orderItem.TotalPrice = item.UnitPrice * buyingListItem.Qty;
        orderItem.Currency = om.Vendor.Currency;
        orderItem.VendorId = om.Vendor.Id;
        om.ItemsList.Add(orderItem);
    }

    return RedirectToAction("ItemListWithBuyingList", new { vendorId = vendorId, orderId = orderId, ItemsList = om.ItemsList });
}

om -> 这是模型,我将它用于整个控制器。

附:我不知道如何制定这个问题以寻找答案,如果已经回答,我很抱歉。

p.p.s.这不是唯一像这样运行的方法,但直到现在我从来没有遇到过这个问题。我一直认为这是因为它是异步运行的。

p.p.p.s 这可能会有所帮助,如果我从浏览器调试,在网络部分,我的 ajax 调用被多次进行(例如:第一次 - 3 次,然后是 6 次,然后是 12 次,等等...... )。我在我的 ajax 调用中返回 false,并且我的代码中没有 href="#"。

谢谢。

【问题讨论】:

标签: c# asp.net-mvc asynchronous


【解决方案1】:

在调试由多个线程访问的代码时,您看到的情况很常见。它看起来很混乱,但它只是为了调试跨不同线程的跳转。

首先,您可以在调试期间使用“锁定”来避免这种情况,这样您就可以专注于业务逻辑而不是线程问题。

【讨论】:

  • 在线程中添加锁将是一个非常糟糕的主意,本质上是将您的异步代码转换为同步代码
  • 我刚试过,但它仍然跳遍整个地方,列表返回为空(我在 om.BuyingListItems 中有 4 个项目)
  • 谢谢利亚姆。为了清楚起见,我建议仅使用 lock 来调试业务逻辑。我并不是说这是一个永久的解决方案。
  • 你的锁码是什么样的?您可能需要锁定静态对象才能调试逻辑
  • 谢谢大家的帮助,我的电话跳来跳去的原因是 $(document).ajaxComplete(.....) 上的一个函数,它再次调用了那个动作,我仍然必须弄清楚为什么我的列表是空的,但至少现在当它从这个方法传递时,它包含了所有的项目。再次感谢大家:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多