考虑以下函数:
static void Main(string[] args)
{
FileStream fs = new FileStream("e:\\temp.txt", FileMode.Open);
int size = (int)fs.Length;
byte[] data = new byte[size];
IAsyncResult result = fs.BeginRead(data, 0, size, new AsyncCallback(Callback), fs);
Console.ReadLine();
}
问题 1: 如果我在 BeginRead 行设置断点,并在调试模式下运行程序,我会收到以下错误:
MyApp.exe 中发生了“System.AccessViolationException”类型的未处理异常。
但是,如果我将断点放在 ReadLine 行并执行相同操作,则不会发生错误。我相信将 FileStream 实例作为最后一个参数传递给 BeginRead 函数会导致问题,但是,我不知道那里发生了什么。
---UPDATE1:您可能会问我为什么要尝试将“fs”传递给回调。是的,我可以将它作为成员变量保存,但是如果我要异步读取多个文件怎么办?这样,保存文件流的数组(或列表)将是不合理的。
问题2: AFAIK,IAsyncResult 定义如下:
[ComVisible(true)]
public interface IAsyncResult
{
object AsyncState { get; }
WaitHandle AsyncWaitHandle { get; }
bool CompletedSynchronously { get; }
bool IsCompleted { get; }
}
但是,在跟踪代码时,我注意到 IAsyncResult 上的其他成员:
这怎么可能?IAsyncResult 显然是由 ReadWriteTask 类(在这种情况下)实现的,但是,我不知道其他属性的来源。
---更新2: 我尝试使用以下代码来模仿:
public interface IMyInterface
{
int Prop1 { get; }
}
public class Impl : IMyInterface
{
public int Prop1 { get { return 101; } }
public int Prop2 { get { return 202; } }
}
public class MyClass
{
public IMyInterface GetMyInterface()
{
Impl impl = new Impl();
return impl;
}
}
为了调用该方法,我只需实例化一个 MyClass 并调用 GetMyInterface 方法,如下所示:
MyClass c = new MyClass();
IMyInterface my = c.GetMyInterface();
但是,当我在 Quickwatch 中观看 my 变量时,我看到了非扁平化结果,这对我来说完全没问题。但是,IAsyncResult / ReadWriteTask 的情况不同。有什么不同?