- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的 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/
我很好奇在 BeginWrite 实际完成写入之前更改 byte[] 是否会影响 FileStream 最终写入的内容。 下面是这段代码,其中 currentPage 是一个字节[],其中包含我要写入
我正在我的 Unity3D 游戏中实现一个 TCP 客户端,我想知道在不等待上一个调用完成写入的情况下调用 NetworkStream.BeginWrite 是否真的安全。 根据我在阅读文档时的理解,
我有一个文件要填满,所以我想最好同时完成。 注意事项: 我同时从多台计算机获取文件。 我每次都在调用 StartWrite 之前设置位置。 -> 我是否必须在每次使用前锁定它? 它好用吗?你有更好的吗
我的 Sender 类有两个方法: public void SendMessage(OutgoingMessage msg) { try { stream.BeginW
假设我有一个流链,执行压缩 -> 加密 -> 文件 I/O。 在 C# 中,使用同步 I/O,它看起来像这样: int n=0; byte[] buffer= new byte[2048];
我有一个用 C# 编写的实用程序,用于与我们的 USB 设备来回通信。我们使用通用 HID 驱动程序并将设备句柄包装在 FileStream 对象中。我使用它的 BeginRead 和 BeginWr
我需要对同一文件进行一批写入,但在文件内的不同位置。我想以尽可能最好的性能实现这一目标,因此查看了同步 FileStream.Write 和异步 FileStream.BeginWrite 方法。 同
在Realm中有两种写事务的方式,它们有什么区别? 1. try! realm.write { ... } 2. realm.beginWrite() ... try! realm.commitW
异步向客户端写入数据时如何防止这个问题 The BeginWrite method cannot be called when another write operation is pending 我
我是一名优秀的程序员,十分优秀!