【发布时间】:2021-10-03 04:56:27
【问题描述】:
我在 AspNet WebApi 控制器中有以下 C# 代码:
private static async Task<string> SaveDocumentAsync(HttpContent content) {
var path = "something";
using (var file = File.OpenWrite(path)) {
await content.CopyToAsync(file);
}
return path;
}
public async Task<IHttpActionResult> Put() {
var path = await SaveDocumentAsync(Request.Content);
await SaveDbRecordAsync(path); // writes something to the database using System.Data and awaiting Async methods
return OK();
}
我有时会在文档写入完成之前看到数据库记录可见。这是一个可能的执行顺序吗? (也有可能我的文件系统没有给我想要的语义)。
澄清我是如何观察到这一点的。它是一个从数据库中读取路径然后尝试读取文件并发现它不存在的应用程序。该文件确实在不久之后出现。 这不会每次都发生,通常文件首先出现。也许 1000 分之一的错误发生。
这被证明是文件系统语义。我以为我已经排除了我复制的文件系统,但我做错了。代码的行为符合预期。
【问题讨论】:
-
I am sometimes seeing the database record visible before the document has finished being written.- 解决方案资源管理器的更新可能比您的数据库晚。文件在那里,但它出现延迟,因为它没有通过 VS 立即建立索引 -
+1 @gpanagopoulos 的评论。具体来说,我已经看到
File.Move()在 docker-alpine 上的操作完成之前返回。将基础镜像从 alpine 切换到 debian 解决了这个问题。这是在 .NET Core 2.2 上的。 -
@Silvermind 我最初正在做类似的事情,但我想在问这个问题之前我已经消除了它。我正在使用 SMB 共享。这可能是客户端缓存的产物,但如果是这样的话,那就很奇怪了,因为 SMB 既有正缓存也有负缓存。消费者不应该在文件写入之前请求文件,因此该机器上的负缓存永远不会被填充。
-
你能不能在完成
HttpContent之后尝试处理它,看看是否有什么不同? -
@TheodorZoulias 我会试试的。需要一些时间,因为这是目前唯一的现场问题...
标签: c# asp.net-web-api async-await