Asp.net 异步等待保存文件原因";进程无法访问文件,因为另一个进程正在使用该文件;错误
我使用以下代码在服务器上保存excel文件,然后读取其内容:Asp.net 异步等待保存文件原因";进程无法访问文件,因为另一个进程正在使用该文件;错误,asp.net,asp.net-core,file-io,async-await,Asp.net,Asp.net Core,File Io,Async Await,我使用以下代码在服务器上保存excel文件,然后读取其内容: if (file.Length > 0) { string path = _hostingEnvironment.ContentRootPath + "/CSV-import-students/"; FileStream fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create); await file.C
if (file.Length > 0)
{
string path = _hostingEnvironment.ContentRootPath + "/CSV-import-students/";
FileStream fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create);
await file.CopyToAsync(fs);
FileInfo fileUploaded = new FileInfo(Path.Combine(path, file.FileName));
using (ExcelPackage package = new ExcelPackage(fileUploaded))
{
StringBuilder sb = new StringBuilder();
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
int rowCount = worksheet.Dimension.Rows;
int ColCount = worksheet.Dimension.Columns;
bool bHeaderRow = true;
}
该文件在服务器上保存良好。但是,当我尝试访问它时,我收到“进程无法访问文件,因为它正被另一个进程使用”错误。如何防止此错误?有什么想法吗 几乎无一例外地,当更新实现了
IDisposable
(例如FileStream
)的类时,您应该使用using
语句:
using (var fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create))
{
await file.CopyToAsync(fs);
}
这将在using
语句超出范围时自动处理资源,在FileStream
的情况下,将刷新写入并关闭文件。这是你问题的根源,所以这会解决你的问题
但是,您可能还需要处理并发问题。有可能同时处理两个请求,这两个请求都需要使用同一个文件。您应该通过捕获文件访问冲突异常并通过重试策略进行响应来规划并发性。异常处理库可以在这里提供帮助。几乎总是这样,在创建实现
IDisposable
(例如FileStream
)的类时,您应该使用using
语句:
using (var fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create))
{
await file.CopyToAsync(fs);
}
这将在using
语句超出范围时自动处理资源,在FileStream
的情况下,将刷新写入并关闭文件。这是你问题的根源,所以这会解决你的问题
但是,您可能还需要处理并发问题。有可能同时处理两个请求,这两个请求都需要使用同一个文件。您应该通过捕获文件访问冲突异常并通过重试策略进行响应来规划并发性。异常处理库可以在这里提供帮助。尝试fs.Close();在等待之后。更好的是:学习如何工作,尤其是使用语句。尝试fs.Close();等待之后。更好的是:学习如何工作,特别是使用语句。感谢您提供的详细信息。我想知道为什么不
等待处理并发性?为什么?如果有什么问题的话,那就是并发性问题,因为操作是异步运行的。异步的定义意味着多个事情可以同时发生,而同步代码会阻塞。但是,在多线程环境(如web服务器)中,甚至多个同步进程也可以同时发生,因为每个is请求都在不同的线程上提供服务。线程被阻塞,但其他线程可以运行相同的代码。我认为如果您担心并发性,也可以使用流。。。所以在等待之后:fs.Position=0;新方案(fs);等等…谢谢你提供的详细信息。我想知道为什么不等待处理并发性?为什么?如果有什么问题的话,那就是并发性问题,因为操作是异步运行的。异步的定义意味着多个事情可以同时发生,而同步代码会阻塞。但是,在多线程环境(如web服务器)中,甚至多个同步进程也可以同时发生,因为每个is请求都在不同的线程上提供服务。线程被阻塞,但其他线程可以运行相同的代码。我认为如果您担心并发性,也可以使用流。。。所以在等待之后:fs.Position=0;新方案(fs);等