为什么 SaveChangesAsync.Wait 在 Blazor 中没有响应?

问题描述 投票:0回答:1

我正在使用 Blazor。 为什么下面代码中的 SaveChangesAsync.Wait() 方法没有返回响应?

反映在数据库中,更新完成,但是永远等待。为什么?

我不想使用同步 SaveChanges() 方法。我想知道这个问题的原因。

private void Run()
{
    try
    {
        var id = Guid.Parse("5C7B0B3D-08FA-406D-ABCA-18EE33321B55");

        var data = DbContext.Set<MyModel>().AsTracking(QueryTrackingBehavior.TrackAll)
                  .Single(x => x.Id == id);

        data.UpdateDate = DateTimeOffset.Now;
    }
    finally
    {
        DbContext.SaveChangesAsync(CancellationToken.None)
        .Wait(CancellationToken.None); // <-- waiting here forever. Why?
    }
}

哪里叫:

private async Task HandleValidSubmit()
{
    Run();

    await JS.InvokeVoidAsync("swalInfo", null, "Demo");
}

razor.cs:

<EditForm Model="@dto" OnValidSubmit="HandleValidSubmit">...
c# asynchronous entity-framework-core blazor
1个回答
1
投票

基本规则是“一路异步”和“保持简单”。在方法声明中是

async
,在调用中是
await
。除非您是异步专家,否则其他一切都是猜测和巫术。

你的

Run
应该看起来像这样。

查看有关如何使用 DBContext 工厂的信息 - https://learn.microsoft.com/en-us/aspnet/core/blazor/blazor-server-ef-core?view=aspnetcore-7.0

private async ValueTask RunAsync()
{
        // You should be using a DbContextFctory here

        using var dbContext = _factory.CreateDbContext();

        var id = Guid.Parse("5C7B0B3D-08FA-406D-ABCA-18EE33321B55");

        var data = await dbContext.Set<MyModel>().AsTracking(QueryTrackingBehavior.TrackAll)
                  .SingleOrDefaultAsync(x => x.Id == id);

        if(data is not null)
        {
            data.UpdateDate = DateTimeOffset.Now;
            var result = await dbContext.SaveChangesAsync(CancellationToken.None);
            if(result == 1)
            {
                // onbly one update so all ok
            }
        }
    }
}

然后:

private async Task HandleValidSubmit()
{
    await RunAsync();

    await JS.InvokeVoidAsync("swalInfo", null, "Demo");
}
© www.soinside.com 2019 - 2024. All rights reserved.