【问题标题】:Blazor aync method doesn't fully executeBlazor 异步方法未完全执行
【发布时间】:2020-08-06 18:01:08
【问题描述】:

做一个任务,我被卡住了。我的代码没有完全通过。我相信等待,异步的东西有问题。

我的问题:在@foreach 方法中,我调用了一个方法“loadEach”,它检查当前订单行是否必须为橙色。但问题是,在 loadEach 方法的中间(在工作 api 调用之后)它会立即被另一个 order.Id 值再次调用,并且 loadEach 方法永远不会完全通过。我该怎么办,那个 blazor 会等到 loadEach 方法完全完成后再去建表?

                @foreach (var order in sortedOrders)
                {
                    loadEach(order.Id).ConfigureAwait(true);

                    <tr style="background-color:@(hasPausedOperation == true ? "#ebc14d" : "")" @onclick="@(() => Selected(order.Id))">
                        @*<td @onclick="@(() => Selected(order.Id))">@order.WorkCenterValue</td>*@
                        <td>@order.OrderNumber</td>
                        <td>@order.Customer</td>
                        <td>@order.ExpectedStartDateTime?.ToString("yyyy-MM-dd")</td>
                        <td>@order.EndDateTime?.ToString("yyyy-MM-dd")</td>
                        <td>@order.ExternalWorker</td>
                        @*<td @onclick="@(() => Selected(order.Id))">@order.Priority</td>*@
                    </tr>
                    @if (orderId != null && orderId == order.Id)
                    {
                        <tr>
                            <td colspan="5">
                                <Logging orderId="order.Id" workCenter="workCenter"></Logging>
                            </td>
                        </tr>
                    }

                    hasPausedOperation = false;
                }
protected async Task loadEach(int orderId)
    {
        if (orderId != 0)
        {
            works = await Http.GetFromJsonAsync<WorksListModel>($"Works?orderId={orderId}");

            foreach (var work in works.Works)
            {
                if ((work.EndDateTime == null && work.StartDateTime != null && canStart && work.WorkLogEndDateTime != null))
                {
                    hasPausedOperation = true;
                }
            }
        }
    }

【问题讨论】:

  • 那2个razor sn-ps有什么区别吗?解释或删除一个。
  • 我在页面末尾发布了整个 loadeach 方法。或者我需要发布更多我不知道的内容?
  • 我现在修复了这个帖子。也许现在更干净了

标签: c# html css blazor


【解决方案1】:

您似乎需要每一行的信息。

最有效的解决方案是让服务器解决这个问题,这样总执行时间会大大降低。 hasPausedOperation 可以是 WorkItem Dto/ViewModel 的属性。

如果您确实希望它像这样延迟,将信息存储在共享变量中并不是最好的方法。而且 Blazor 不支持 razor 部分的异步代码。

所以,选项a:

 var hasPausedOperation = loadEach(order.Id); // no await

但这需要bool loadEach(int orderId),没有异步,没有任务。您必须在 HttpClient 调用中调用 .Result。

更好的选择 b,为行创建一个组件:

@foreach (var order in sortedOrders)
{
   <OrderRow Order="@order" />
}

OrderRow 组件中,您有一个异步 OnInitializedAsync(),您可以在其中正确处理此问题。

您可以拥有一个 &lt;tr&gt; 的组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2016-08-04
    • 2019-08-25
    • 2015-08-18
    • 1970-01-01
    • 2020-11-20
    • 2014-08-03
    相关资源
    最近更新 更多