【发布时间】:2018-12-15 05:08:03
【问题描述】:
在我当前的应用程序中,我发送一条 UDP 消息,如果数据包未被服务器确认,则在一秒钟后重新发送。现在我使用 volatile bool 作为终止标志,在主线程中,当收到 ACK 时,该标志设置为 true,如断点所确认,但在此之后,在“if(done) break;”期间在我的另一个线程中,标志仍然是假的。
ThreadStart processTaskThread = delegate {
send(text);
};
new Thread(processTaskThread).Start();
void send(string text)
{
while (true)
{
byte[] data = Encoding.ASCII.GetBytes(text);
_socket.BeginSend(data, 0, data.Length, SocketFlags.None, (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndSend(ar);
Console.WriteLine("SEND: {0}, {1}", bytes, text);
}, state);
Thread.Sleep(1000);
if (kill) break;
}
}
现在,这里的标志被断点确认正确设置为真:
private void Receive()
{
_socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
_socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
try {
string Rec = Encoding.ASCII.GetString(so.buffer, 0, bytes);
if (Rec.StartsWith("ACK:"))
{
kill = true;
return;
}
但回到线程循环中的条件,它仍然是假的。任何帮助表示赞赏。
【问题讨论】:
-
请提供说明问题的minimal reproducible example;我们可以把一些东西放在一个文件中并编译/运行。
-
“我发送一条 UDP 消息,如果数据包未被服务器确认,则在一秒钟后重新发送” - 听起来您应该使用 TCP,而不是 UDP。
标签: c# multithreading