2012-02-15 55 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实例 - 不是一件好事。