C# - 在我的 MVC 项目中读取文件内存流时出现问题
C# - Problem reading File memorystream in my MVC project
如下图我的代码,上传的图片文件有时读空(fileContents
设置为0)或者读一半。正如我所测试的那样,当我使用调试模式从 myViewModel.File.CopyToAsync(memoryStream);
慢慢过渡到 myViewModel.Image =...
时,我可以看到 fileContents
正在接收正确的值。所以我相信内存流副本有问题,但我不明白为什么。
然而,当我通过删除注释 System.Threading.Thread.Sleep(1000);
使线程休眠时,读取图像就完成了,并且 fileContents
得到了正确的值。会不会是声明using (var memoryStream = new MemoryStream())
导致的问题?问题是由什么引起的?有没有比让线程休眠更好的方法来解决这个问题?
if (myViewModel.File != null)
{
byte[] fileContents;
using (var memoryStream = new MemoryStream())
{
myViewModel.File.CopyToAsync(memoryStream);
//System.Threading.Thread.Sleep(1000);
fileContents = memoryStream.ToArray();
myViewModel.Image = new MyImage{ FileName = myViewModel.File.FileName, File = myViewModel.File, ContentType = myViewModel.File.ContentType, FileData = fileContents };
}
}
问题是您在不等待的情况下调用异步方法。
myViewModel.File.CopyToAsync(memoryStream);
能否将方法重写为 async
并使用 await
这个词?
然后您可以等待 CopyToAsync 方法。
await myViewModel.File.CopyToAsync(memoryStream);
您没有等待 myViewModel.File.CopyToAsync(memoryStream) 完成。
要么使用
await myViewModel.File.CopyToAsync(memoryStream);
或者根本不使用异步:
myViewModel.File.CopyTo(memoryStream);
如下图我的代码,上传的图片文件有时读空(fileContents
设置为0)或者读一半。正如我所测试的那样,当我使用调试模式从 myViewModel.File.CopyToAsync(memoryStream);
慢慢过渡到 myViewModel.Image =...
时,我可以看到 fileContents
正在接收正确的值。所以我相信内存流副本有问题,但我不明白为什么。
然而,当我通过删除注释 System.Threading.Thread.Sleep(1000);
使线程休眠时,读取图像就完成了,并且 fileContents
得到了正确的值。会不会是声明using (var memoryStream = new MemoryStream())
导致的问题?问题是由什么引起的?有没有比让线程休眠更好的方法来解决这个问题?
if (myViewModel.File != null)
{
byte[] fileContents;
using (var memoryStream = new MemoryStream())
{
myViewModel.File.CopyToAsync(memoryStream);
//System.Threading.Thread.Sleep(1000);
fileContents = memoryStream.ToArray();
myViewModel.Image = new MyImage{ FileName = myViewModel.File.FileName, File = myViewModel.File, ContentType = myViewModel.File.ContentType, FileData = fileContents };
}
}
问题是您在不等待的情况下调用异步方法。
myViewModel.File.CopyToAsync(memoryStream);
能否将方法重写为 async
并使用 await
这个词?
然后您可以等待 CopyToAsync 方法。
await myViewModel.File.CopyToAsync(memoryStream);
您没有等待 myViewModel.File.CopyToAsync(memoryStream) 完成。
要么使用
await myViewModel.File.CopyToAsync(memoryStream);
或者根本不使用异步:
myViewModel.File.CopyTo(memoryStream);