2012-02-15 56 views
2

我打開要異步寫入的FileStream。處理FileStream不會結束異步讀取

m_oFile.BeginRead(arrInputReport, 0, m_nInputReportLength, new AsyncCallback(ReadCompleted), arrInputReport); 

我處理這個使用下面的代碼:

if (bDisposing) 
      { 
       if (m_oFile != null) 
       { 
        m_oFile.Dispose(); 
        m_oFile = null; 
       } 

不幸的是,調用Dispose方法後,ReadComplete方法仍然會收到結果:

protected void ReadCompleted(IAsyncResult iResult) 
    { 
     byte[] arrBuff = (byte[])iResult.AsyncState; // retrieve the read buffer 
     try 
     { 
       m_oFile.EndRead(iResult); 

它會得到一個nullReference錯誤m_oFile.EndRead行。檢查null可以消除這個異常,但只是在該方法中捕獲程序。我該如何處置ReadComplete方法?

+1

在調用EndRead()之前,請勿訪問*任何東西*。這將拋出ObjectDisposedException讓你的代碼知道讀取沒有正常完成。 – 2012-02-15 14:54:51

+0

感謝漢斯。就是這樣。 – drinck 2012-02-16 21:26:57

回答

0

如果您沒有可靠訪問您使用的實例,那麼我會建議使用AsyncState來存儲所有你需要的東西。例如:

var state = Tuple.Create(m_oFile, arrInputReport); 
m_oFile.BeginRead(...blah... , ReadCompleted, state); 

有:

var state = (Tuple<FileInfo, byte[]>)iResult.AsyncState; 
FileInfo file = state.Item1; 
byte[] arrBuff = state.Item2; 

注意空檢查是不夠的,因爲如果一個文件已被使用,你會調用它在錯誤的FileInfo實例 - 不是一件好事。