sslstream Метод BeginWrite не может быть вызван, когда ожидается другая операция записи

У меня возникли проблемы с тем, чтобы заставить sslstream работать с отправкой нескольких сообщений друг за другом.

Как я вызываю своего клиента для отправки данных

client.Send(objectOne);
client.Send(objectTwo);

сообщение об ошибке, которое я получаю:

The BeginWrite method cannot be called when another write operation is pending

Я пробовал разные решения, чтобы заставить это работать, но ни одно из них не заставляет его работать.

Базовая функция использует ожидание, и эта функция вызывается

// client send
public void Send(object data)
{
    byte[] sendData = SerializationHelper.Serialize(data);
    base.Send(sendData);
}
// base send
protected async void Send(byte[] data)
{
    await stream.WriteAsync(data, 0, data.Length);
}

Базовая функция возвращает задачу и использует await в клиентском методе.

// client send
public async void Send(object data)
{
    byte[] sendData = SerializationHelper.Serialize(data);
    await base.Send(sendData);
}
// base send
protected async Task Send(byte[] data)
{
    await stream.WriteAsync(data, 0, data.Length);
}

я все еще получаю ту же ошибку, кто-нибудь знает, как заставить это работать?


person trembon    schedule 09.10.2012    source источник


Ответы (1)


Я еще не слишком хорошо знаком с библиотекой параллельных задач, но... Делая Send методом async, вы начинаете операцию отправки, но не ждете ее завершения. Вам нужно дождаться завершения Send. Один из способов сделать это — запустить его синхронно:

client.Send(objectOne).RunSynchronously();
client.Send(objectTwo).RunSynchronously();

Вместо этого вы также можете сделать это на уровне клиента следующим образом:

// client send
public void Send(object data)
{
    byte[] sendData = SerializationHelper.Serialize(data);
    base.Send(sendData).RunSynchronously();
}
// base send
protected async void Send(byte[] data)
{
    await stream.WriteAsync(data, 0, data.Length);
}
person Dark Falcon    schedule 09.10.2012
comment
попробовал с редактированием в клиенте, как в последнем коде, который вы написали, и получил эту ошибку, теперь RunSynchronously не может быть вызван для задачи, не связанной с делегатом, такой как задача, возвращенная из асинхронного метода. Любые идеи? - person trembon; 09.10.2012