爲什麼使用FileOptions.Asynchronous創建FileStream會導致FileStream.BeginRead阻塞調用線程?FileOptions.Asynchronous導致FileStream.BeginRead阻止
這裏是代碼片段:
private static Task<int> ReadFileAsync(string filePath)
{
var file = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 64 * 1024, FileOptions.Asynchronous);
FileInfo fi = new FileInfo(filePath);
byte[] buffer = new byte[fi.Length];
Task<int> task = Task<int>.Factory.FromAsync(file.BeginRead, file.EndRead, buffer, 0, buffer.Length, null);
return task.ContinueWith(t =>
{
file.Close();
Console.WriteLine("Done ReadFileAsync, read " + t.Result + " bytes.");
return t.Result;
});
}
當使用JetBrains公司dotPeek好像有在他們的代碼中的錯誤在MSFT的FileStream代碼周圍挖:
if (!this._isAsync)
return base.BeginRead(array, offset, numBytes, userCallback, stateObject);
else
return (IAsyncResult) this.BeginReadAsync(array, offset, numBytes, userCallback, stateObject);
的的BeginRead方法實際上似乎通過安排任務來異步讀取,但BeginReadAsync方法實際上最終會執行同步讀取。 所以他們的方法命名命名是倒退的,並且調用哪個方法的邏輯是錯誤的。如果this._isAsync == true,則應該調用BeginRead。
因此,似乎要讓FileStream.BeginRead立即返回(異步調度讀取),您實際上必須將cosntructor中的useAsync參數設置爲false。
你打算用發佈的代碼片段展示什麼?我無法從中得到任何信息。 – usr
上面的發佈代碼將重現執行線程阻塞在線任務 .Factory.FromAsync(...)直到文件讀取完成的行爲。所以它本質上與我期望的相反,並且以同步方式而不是異步方式讀取文件。這種行爲是什麼讓我感到困惑... –
dmg