即使在开始复制之前,异步执行文件打开的最佳方法是什么。我得到的例外是该文件无法访问,因为它被另一个进程使用。
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);
}
}
答案 0 :(得分:1)
没有;尝试同时打开文件的不同线程会相互干扰。您可以锁定共享对象以强制线程一次运行一个。
或者只使用内置的.NET跟踪功能;您可以配置app.config以写入文件。
答案 1 :(得分:-1)
我找到了解决方案。只需切换到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);
}
}