我正在使用 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">...
基本规则是“一路异步”和“保持简单”。在方法声明中是
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");
}