C# 如何在C中异步打开文件#
即使在开始复制之前,异步执行文件打开的最佳方法是什么。我得到的一个例外是,该文件不可访问,因为它正被另一个进程使用C# 如何在C中异步打开文件#,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,即使在开始复制之前,异步执行文件打开的最佳方法是什么。我得到的一个例外是,该文件不可访问,因为它正被另一个进程使用 try { using (var sourceStream = new FileStream(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize: 4096, useAsync: true)) { using (var destinatio
try
{
using (var sourceStream = new FileStream(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize: 4096, useAsync: true))
{
using (var destinationStream = File.Create(pathToProcessedMedia))
{
await sourceStream.CopyToAsync(destinationStream);
}
}
}
catch (Exception)
{
throw new ApplicationException();
}
我尝试了如下所示的替代方法,但没有成功。同样的错误也普遍存在
using (var sourceStream = await Task.Factory.StartNew(() => File.Open(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.None)))
{
using (var destinationStream = File.Create(pathToProcessedMedia))
{
await sourceStream.CopyToAsync(destinationStream);
}
}
没有;试图同时打开文件的不同线程将相互干扰。您可以锁定共享对象以强制线程一次运行一个
或者只使用内置的.NET跟踪功能;您可以将app.config配置为写入文件。我找到了解决方案。简单地切换到Fileshare.ReadWrite就解决了这个问题
using (var sourceStream = await Task.Factory.StartNew(() => File.Open(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
using (var destinationStream = File.Create(pathToProcessedMedia))
{
await sourceStream.CopyToAsync(destinationStream);
}
}
我通过删除正在创建的任务来修改解决方案。它现在运行良好
using (var sourceStream = File.Open(pathToDownloadedMedia, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var destinationStream = File.Create(pathToProcessedMedia))
{
await sourceStream.CopyToAsync(destinationStream);
}
}
“异步执行文件打开”句柄正在同步打开。为什么您认为异步打开它会使错误消失?@Sharique正在使用处理您正在使用FileShare.None打开FileStream的文件。你用FileShare.Read试过了吗?@YuvalItzchakov我试过在任务中包装文件.Open(),并等待它,但还是出现了同样的错误。无论是同步还是异步,这都不起作用。这与此无关。您只是在访问被另一个进程锁定的文件。这不是任务的正确使用,在任务中简单地包装同步I/O代码是一种浪费。