【问题标题】:sslstream "The BeginWrite method cannot be called when another write operation is pending"sslstream“当另一个写操作挂起时,无法调用 BeginWrite 方法”
【发布时间】:2012-10-09 13:17:25
【问题描述】:

我在让 sslstream 处理一个接一个地发送多条消息时遇到了一些麻烦。

我打电话给我的客户发送数据的方式

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

我收到的错误信息是:

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

我已经尝试了不同的解决方案来让它工作,但没有一个能让它工作。

基础函数使用 await,然后调用该函数

// 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);
}

我仍然收到同样的错误,有人知道如何让它工作吗?

【问题讨论】:

    标签: c# sslstream


    【解决方案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);
    }
    

    【讨论】:

    • 尝试在客户端进行编辑,就像您编写的最后一个代码一样,现在出现此错误“可能不会在未绑定到委托的任务上调用 RunSynchronously,例如从异步方法返回的任务。”有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2017-05-17
    • 2021-09-25
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多