2014-02-05 100 views
-1

我決定寫一個函數來計算文件中的字節數。差異調用FileStream.ReadAsync有/沒有等待

「正常」和異步。

所以我寫了以下功能:

功能1個

public static async Task<int[]> ByteFrequencyCountAsync(string fname) 
{ 
    // freqs 
    int[] counted = new int[256]; 
    // buf len 
    int blen = FileAnalisys.ChooseBuffLenght(fname); 
    // buf 
    byte[] buf = new byte[blen]; 

    int bytesread; 

     using (FileStream fs = new FileStream 
              (
               fname, 
               FileMode.Open, 
               FileAccess.Read, 
               FileShare.Read, 
               blen, 
               FileOptions.Asynchronous 
              )) 
     { 

      while ((bytesread = await fs.ReadAsync(buf, 0, blen)) != 0) 
      { 

       foreach (byte b in buf) 
       counted[b]++; 

      } 
     } 

     return counted; 
} 

功能2

public static int[] ByteFrequencyCount(string fname) 
{ 

    Task<int[]> bytecount = Task.Run<int[]>(() => 
    {    
     // freqs 
     int[] counted = new int[256]; 
     // buf len 
     int blen = FileAnalisys.ChooseBuffLenght(fname); 
     // buf 
     byte[] buf = new byte[blen]; 

     int bytesread; 

     using (FileStream fs = new FileStream 
              (
               fname, 
               FileMode.Open, 
               FileAccess.Read, 
               FileShare.Read, 
               blen, 
               FileOptions.Asynchronous 
              ))                
     { 

      while ((bytesread = fs.ReadAsync(buf, 0, blen).Result) != 0) 
      { 
       foreach (byte b in buf) 
        counted[b]++; 

       }    
     } 

     return counted; 
    }); 
     return bytecount.Result; 
} 

我覺得功能1個執行讀取和異步功能2同步進行。

功能1個

while ((bytesread = await fs.ReadAsync(buf, 0, blen)) != 0) 

功能2

while ((bytesread = fs.ReadAsync(buf, 0, blen).Result) != 0) 

總之。我猜測任務沒有等待和未標記爲異步執行通過線程池,但同步。所以我可以更改fs.ReadASync fs.Read並沒有任何反應。

需要一隻手,因爲我有點困惑。

EDIT1: 功能2應該是同步,所以我關於它的問題:

代碼的工作,但我認爲使用FileStream.Asynchronous有沒有意義。

我想用fs.ReadASync來代替fs.Read並沒有真正的好處。所以它應該被 fs.Read取代。

+0

這是不一樣的。只看到返回類型。所以'bytesread = fs.ReadAsync(......)'是不可編譯的。 –

+1

你在問什麼?我在這裏沒有看到問題。 – Servy

+1

你的問題是什麼?等待關鍵字將釋放當前線程返回給調用者,然後在方法完成時再次拿起。無需等待您不會釋放當前線程並將同步執行 –

回答

0

用Async標記該方法並不是如此。只有當awaiter是用戶時,方法體纔會以異步方式執行。你可以看到Async/Await如何在這裏工作的一個很好的探索Async/Await under the sheets

Task.Run將以阻塞&同步方式執行。

FileStream.ReadAsync()方法返回一個可等待的任務<>所以它不是無用的。如果您不想要,您不必等待,但如果需要,您也可以取消它。

看一看here正確使用

+0

感謝您的幫助達斯汀。 – ppk