【发布时间】:2011-07-21 10:52:16
【问题描述】:
晚上好,提前写了这么多,但我不知道错误在哪里......
我的客户端应用程序正在从服务器异步接收。我想一次传输一堆东西(数组的内容,几百字节)。
我希望服务器能够发送“命令”,并在客户端有一个函数根据这些命令进行操作,例如,如果来自服务器的消息读取"print_hello",它应该调用一个打印的函数你好。
现在,我的理解是,当异步接收数据时,我无法知道已经发送了多少数据(或者是否发送了比我预期更多的数据),所以我需要将所有数据存储在一个缓冲区,并且当收到“命令结束”(例如,'!')标志时,它应该知道调用该函数。
到目前为止,这对我来说是有意义的,但我在实施它时遇到了麻烦。在我的 DataReceived 回调函数中,我有以下代码:
Console.WriteLine("Raw data: {0}", data));
mainBuffer += data;
Console.WriteLine(mainBuffer);
mainBuffer 被声明为volatile static string mainBuffer = "";
第一行打印正确,并按预期遍历所有数据。但是,当我打印出mainBuffer 时,它只会打印出我收到的第一组数据,其余的不会被添加到缓冲区中。
是什么原因造成的?线程安全问题?我没有读取 mainBuffer 的最新值吗?我不能使用断点来调试它。
样本输出:
Raw data: ABC
ABC
Raw data: DEF
ABC
RAW data: GHI
ABC
小更新,我也尝试使用volatile static int,它会在每个DataReceived() 之后正确递增和打印。然而,字符串仍然没有得到更新。
【问题讨论】:
-
你在哪里声明了 mainBuffer?您确定不是每次收到时都将其重置为“”吗?
标签: c# multithreading string sockets console