gpt4 book ai didi

c# - 两个并发的 NetworkStream.BeginWrite 调用会发生什么?

转载 作者:可可西里 更新时间:2023-11-01 02:33:34 37 4
gpt4 key购买 nike

我的 Sender 类有两个方法:

public void SendMessage(OutgoingMessage msg)
{
try
{
stream.BeginWrite(msg.TcpData, 0, 16, messageSentCallback, msg);
}
catch
{
// ...
}
}

private void messageSentCallback(IAsyncResult result)
{
stream.EndWrite(result);

if (result.IsCompleted)
onDataSent(result.AsyncState as OutgoingMessage);
}

程序的其他部分可以调用(如果它们可以访问 Sender)SendMessage() 方法。由于程序在多线程环境下运行,因此多个线程都可以访问 Sender 对象。

我有2个问题:

Q1)SendMessage 方法进行两次并发调用是否会扰乱 TCP 通信(通过用混合数据填充 TCP 传出缓冲区)?

Q2)stream.BeginWrite() 调用包含在 lock { } 中会解决这个问题吗?

据我所知,对 BeginWrite 的调用只是将数据存储到 TCP 传出缓冲区中。是吗?

最佳答案

是的,需要加锁以避免出现问题。但是,我会切换到不同的方法,既可以解决并发问题,也可以使线程交互更容易推理。

您可以有一个共享队列,其中多个线程将需要写入流的请求放入其中。然后单个线程从队列中读取请求并进行写操作。现在更容易理解正在发生的事情,您不必担心同步写入。您可以使用其中一个并发集合,例如 ConcurrentQueue

关于c# - 两个并发的 NetworkStream.BeginWrite 调用会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9363336/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com