Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中异步打开文件#_C#_.net_Asynchronous_Async Await - Fatal编程技术网

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代码是一种浪费。