如何在C#中异步打开文件

时间:2015-02-26 13:13:51

标签: c# .net asynchronous async-await

即使在开始复制之前,异步执行文件打开的最佳方法是什么。我得到的例外是该文件无法访问,因为它被另一个进程使用。

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);
                        }
                    }

2 个答案:

答案 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);
                        }
                    }