gpt4 book ai didi

c# - 重叠 Socket.BeginSend/EndSend 调用的可预测行为

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:08 24 4
gpt4 key购买 nike

比如说,我有一个类,它包装了一个 Socket 并且(除其他外)执行异步数据发送。

我按以下方式执行发送(大大简化 - 无错误处理等):

private Socket _socket;

public void Write(byte[] data, Action callback)
{
_socket.BeginSend(
data, 0, data.Length, SocketFlags.None,
new AsyncCallback(WriteMaybeDone),
new { Data = data, SentSoFar = 0, Callback = callback}
)
}

public void WriteMaybeDone(IAsyncResult ar)
{
int bytesSent = _socket.EndSend(ar);
var state = ar.AsyncState;
state.SentSoFar += bytesSent;
if (state.SentSoFar < state.Data.Length) {
_socket.BeginSend(
data, state.SentSoFar, State.Data.Length - state.SentSoFar,
SocketFlags.None,
new AsyncCallback(WriteMaybeDone), state
);
} else {
if (state.Callback != null) {
state.Callback();
}
}
}

这里我们确保在调用传递的回调之前发送所有数据。

如何确保对 Write 的“重叠”调用以可预测的方式运行?特别是因为传递给 BeginSend 的回调可能会在所有数据发送之前被调用。我需要确保传递给 Write 调用的数据进入线路而不是与传递给后续 Write 调用的数据交织在一起,这些调用是在第一次回调之前进行的写入被触发。

我受限于 .NET 3.5

最佳答案

只有在上一个发送操作完成后才开始下一个发送操作。您可以将要发送的数据排入队列,或使用信号机制(如 AsyncSemaphoreTaskCompletionSource)通知下一次写入前一次写入已完成。

换句话说,使用生产者-消费者设计模式。生产者是想要写入的操作。单个消费者是一个线程或异步工作流,一个接一个地执行物理写入。

关于c# - 重叠 Socket.BeginSend/EndSend 调用的可预测行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284000/

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