【发布时间】:2014-08-26 19:37:07
【问题描述】:
我爱上了 async 和 await,但是我不知道如何在不使用 Task.Run 的情况下等待文件打开。似乎有一个API in WRT。 .NET 4.5 等效项在哪里?我问是因为如果我正在访问远程机器上的 UNC 共享,如果机器因某种原因关闭或没有响应网络请求,这可能会阻塞很长时间。这似乎是一个很大的网站。
using (FileStream stream = await Task.Run(() => new FileStream(@"c:\temp\text.txt", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read, 4096, true)))
{
byte[] bytesToRead = new byte[stream.Length];
await stream.ReadAsync(bytesToRead, 0, bytesToRead.Length).ConfigureAwait(false);
return bytesToRead;
}
【问题讨论】:
-
调用
new FileStream不会开始从流中读取,没有理由使用Task.Run。您的代码在到达await stream.ReadAsync时已经是异步的,它实际上开始从流中读取。 -
我不同意:
Stopwatch sw = Stopwatch.StartNew(); try { new FileStream(@"\\10.1.1.2\c$\test", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read, 4096, true); } catch (Exception ee) { Trace.WriteLine(ee.Message); } finally { Trace.WriteLine(sw.Elapsed); }找不到网络路径。 00:00:38.5445538 这需要 30 秒。在引擎盖下它最终会调用:[link]referencesource.microsoft.com/#mscorlib/microsoft/win32/… 这是同步的。 -
我刚刚尝试打开一个 4GB 文件的句柄,我花了 00:00:00.0004030。我这样称呼它:
var fs = new FileStream(@"C:\HugeFile.zip", FileMode.Open, FileAccess.Read, FileShare.Read); -
那个文件是本地的。尝试通过我在示例中不存在的 unc 打开网络共享。这将需要很长时间。
-
您确定花费的时间是打开手柄所消耗的吗?我认为它是罪魁祸首的网络线。
标签: c# .net async-await