Когда вы вызываете BeginXXX
, вы, вероятно, получаете объект IAsyncResult
, чтобы вызвать EndXXX
, вам нужно передать эту ссылку IAsyncResult
в метод.Если вы использовали один и тот же объект из Read и передали его в Write, он не будет работать - в вашем сценарии будут два отдельных IAsyncResult
объекта.
Когда я делаю это, я сохраняю ссылку навозвращенный IAsyncResult
как локальная переменная класса (если используются обратные вызовы).Когда я звоню EndXXX
, я предоставляю эту локальную ссылку (полученную из моего начального BeginXXX
) и впоследствии обнуляю ее, чтобы показать, что ее можно использовать повторно.
Обновление 2: , глядя на ваш кодто, что должно быть EndWrite
в WriteCallback
, на самом деле EndRead
, ошибка пикника: -)
Обновление 1: для меня нормально работает следующее ...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication14
{
class Program
{
static FileStream fs = null;
static MemoryStream ms = null;
static byte[] buffer = new byte[512];
static void Main(string[] args)
{
fs = new FileStream("theFile", FileMode.Open);
fs.BeginRead(buffer, 0, 512, new AsyncCallback(ReadFinished), null);
Console.Read();
}
static void ReadFinished(IAsyncResult res)
{
fs.EndRead(res);
fs.Dispose();
ms = new MemoryStream();
ms.BeginWrite(buffer, 0, 512, new AsyncCallback(WriteFinished), null);
}
static void WriteFinished(IAsyncResult res)
{
ms.EndWrite(res);
ms.Dispose();
}
}
}