C#如何处理在辅助线程里面接收到的数据呢?

我现在使用SerialPort控件接收从串口过来的数据,使用的是SerialPort的DataReceived,DataReceived是在辅助线程里面的,现在的情况是可... 我现在使用SerialPort控件接收从串口过来的数据,使用的是SerialPort的DataReceived,DataReceived是在辅助线程里面的,现在的情况是可以正常的接收到这些数据了,但是,不知道该如何把这些接收到的数据在主线程中实时处理。

以前都没有接触过C#,我现在的想法是,使用消息队列,在接收到数据后,把这些接收到的数据放入队列里面,然后发送出去,而处理这些数据的程序则是一直在等待这个消息队列的到来,(以前只接触过C和uCOS,uCOS是可以这样处理的)。

不知道C#是否也可以这样子做,如果的话,应该怎么做呢?因为我看到C#里面有个PostMessage,所以我才有了上面的想法。

如果上面的想法是错,请问应该怎么做好呢?
展开
 我来答
百度网友9ba62ef
推荐于2016-04-15 · TA获得超过282个赞
知道小有建树答主
回答量:169
采纳率:0%
帮助的人:63.2万
展开全部
放到队列里,然后主线程轮询读取即可。不通的线程访问同一资源记得加锁。

比如你要DataReceived的数据(字符串)显示到界面的TextBox上,
那可以如此:

private StringBuilder sb = new StringBuilder();

====DataReceived事件(string data):
lock(sb){
sb.append(data);
}

====界面上可以用Timer来刷新:
string str = "";
lock(sb){
str = sb.tostring();
sb.clear();
}
txtbox.append(str);

第一个事件是串口的线程
第二个是UI线程(也就是主线程了)
更多追问追答
追问
那些数据最少会有以下的处理:

1、这些数据需要进行校验,如果校验通过,认为这些数据是有效的。
2、如果数据是有效的,把这些数据保存起来,文本保存或是其它格式保存。
3、提取数据里面的信息。
4、对提取出来的信息进行各种处理

我自己已经是用定时器实现了,但用定时器实现的方法感觉没有使用消息队列的好
追答
你所谓的消息队列是系统自带的那个吗?——那你还不如用定时器。
你用系统自带的那个消息队列,等于是进程间通信了,肯定没有你同一进程内处理的好啦。

你提出的1234点,都不会有什么问题。
但是如果你只是验证数据,保存数据,但是并没有涉及到UI的话,都可以在DataReceived里面处理(或者传给相关的函数)即可。意思就是用串口的那个线程处理。

要显示到界面的数据才跟UI做临界资源锁。

就是,“本来就不在主线程的,并且能不用主线程做逻辑处理的尽量不要用主线程。”
程序的消息循环就在UI上,你做耗时处理弄界面卡就很不友好了。

另外,我也支持楼上的写法。
bambuz
2012-04-27 · TA获得超过168个赞
知道小有建树答主
回答量:329
采纳率:0%
帮助的人:313万
展开全部
如果只是显示数据, 可以在 DataReceived 里调用下面的方法:
string strRead= comPort.ReadLine();
ShowInfo(strRead);

private void ShowInfo(string msg)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(ShowInfo), msg);
}
else
{
ListBox1.Items.Add(msg);
}
}
追问
不是的,那些数据最少会有以下的处理:

1、这些数据需要进行校验,如果校验通过,认为这些数据是有效的。
2、如果数据是有效的,把这些数据保存起来,文本保存或是其它格式保存。
3、提取数据里面的信息。
4、对提取出来的信息进行各种处理
追答
那就在 DataReceived 事件方法里进行处理:
string strRead= comPort.ReadLine();
// 处理 code
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式