Blazor 服务器 EF Core 取消
Blazor Server EF Core Cancelation
在我的应用程序中,我必须能够取消上传,我尝试使用线程取消但没有任何反应,我认为这是因为我使用了 DBContextFactory 并为每个上传的文件创建了一个上下文。
所以我这样做是为了将文件保存在数据库中:
private async Task OnFilesDropped(FileUploadModel upload)
{
Uploads.Add(upload);
if (string.IsNullOrEmpty(upload.Error))
{
using var context = DbFactory.CreateDbContext();
upload.Context = context;
context.FileUploads.Add(upload);
upload.UploadCompletion = 45;
await context.SaveChangesAsync();
upload.UploadCompletion = 100;
}
}
在删除 uploaded/uploading 文件的情况下:
private async Task DeleteUpload(FileUploadModel upload)
{
Uploads.Remove(upload);
await UploadsChanged.InvokeAsync(Uploads);
if (string.IsNullOrEmpty(upload.Error))
{
if (upload.UploadCompletion != 100)
{
await upload.Context.DisposeAsync();
}
else
{
using var context = DbFactory.CreateDbContext();
context.FileUploads.Remove(upload);
await context.SaveChangesAsync();
}
}
}
这种方法可行,因为我处理了上下文,但我想知道是否有更好的方法来做到这一点?或者如果这个解决方案可能有问题?
此致。
你应该使用 CancellationToken
.
您上下文中的 SaveChangesAsync
方法有一个重载,可以提供一个 cancellationToken。
await context.SaveChangesAsync(cancellationToken);
如果您在调用堆栈中已经有一个 CancellationToken
更高层,您可以将那个向下传递。否则,您可以创建一个 CancellationTokenSource
并使用它来生成取消令牌,然后在适当的时候取消它。
在我的应用程序中,我必须能够取消上传,我尝试使用线程取消但没有任何反应,我认为这是因为我使用了 DBContextFactory 并为每个上传的文件创建了一个上下文。
所以我这样做是为了将文件保存在数据库中:
private async Task OnFilesDropped(FileUploadModel upload)
{
Uploads.Add(upload);
if (string.IsNullOrEmpty(upload.Error))
{
using var context = DbFactory.CreateDbContext();
upload.Context = context;
context.FileUploads.Add(upload);
upload.UploadCompletion = 45;
await context.SaveChangesAsync();
upload.UploadCompletion = 100;
}
}
在删除 uploaded/uploading 文件的情况下:
private async Task DeleteUpload(FileUploadModel upload)
{
Uploads.Remove(upload);
await UploadsChanged.InvokeAsync(Uploads);
if (string.IsNullOrEmpty(upload.Error))
{
if (upload.UploadCompletion != 100)
{
await upload.Context.DisposeAsync();
}
else
{
using var context = DbFactory.CreateDbContext();
context.FileUploads.Remove(upload);
await context.SaveChangesAsync();
}
}
}
这种方法可行,因为我处理了上下文,但我想知道是否有更好的方法来做到这一点?或者如果这个解决方案可能有问题?
此致。
你应该使用 CancellationToken
.
您上下文中的 SaveChangesAsync
方法有一个重载,可以提供一个 cancellationToken。
await context.SaveChangesAsync(cancellationToken);
如果您在调用堆栈中已经有一个 CancellationToken
更高层,您可以将那个向下传递。否则,您可以创建一个 CancellationTokenSource
并使用它来生成取消令牌,然后在适当的时候取消它。