需求就是要把 BeginInvoke + EndInvoke + IAsyncResult 這種非同步模式改成同步模式。
似乎應該說是阻塞(Blocking)模式。
需要的是用到 System.Threading.AutoResetEvent 這個物件。
注意 signal.Set() 與 signal.WaitOne() 的位置
還有 signal 宣告的範圍
byte[] ReadTheFile(string filepath)
{
var signal = new AutoResetEvent(false);
var buf = new byte[1024];
var stream = File.OpenRead(filepath);
int readCount = 0;
stream.BeginRead(buf, 0, buf.Length, new AsyncCallback(asyncResult =>
{
FileStream myStream = (FileStream)asyncResult.AsyncState;
readCount = myStream.EndRead(asyncResult);
signal.Set();
}), stream);
signal.WaitOne();
stream.Dispose();
var result = new byte[readCount];
buf.CopyTo(result, 0);
return result;
}
我這麼做的原因是想把只有 APM 的改成 TAP,先把 APM 改成 block 再改成 TAP。也許將來有更好的方法。
沒有留言:
張貼留言