请教一个C#的问题。。

2013-07-24 15:08:30 +08:00
 jackyzy823
现在我想做一个界面,有1个textbox,和两个button ,一个button是开始,点击后,开始接受数据[从串口],并显示在textbox里,另一个button 是停止,即停止上述的操作。
现在的问题是:
单纯的在开始的那个函数中用无限循环来接受数据的话,会导致整个界面都卡死,就无法点击停止的button,也就无法终止。

尝试过用backgroundWorker,但是由于其不支持在DoWork 事件处理中操作任何用户界面对象,即无法再接受的同时在textbox中显示,而他提供的ReportProgress对我而言也没什么用。

请问V上的各位,应该如何解决。。。
3837 次点击
所在节点    .NET
9 条回复
66450146
2013-07-24 15:11:13 +08:00
Control.Invoke
cxe2v
2013-07-24 15:14:20 +08:00
创建一个子线程用来接收数据,每接收一次返回一个值用来指示主线程刷新textbox,
timonwong
2013-07-24 15:16:49 +08:00
方法多了
1. 调用GUI部分使用MethodInvoker把委托给GUI线程调用,这个耦合比较重,不过对知识点没啥要求。(当然处理部分可以BackgroundWorker, Thread, TPL等等)。
2. Reactive Extensions,这个写习惯了就相当方便,要求你换换脑子。
msg7086
2013-07-24 16:43:08 +08:00
Thread.Start
this.Invoke
nybux
2013-07-24 16:59:39 +08:00
c#做串口,不知道你用的是不是SerialPort,有个DataReceived的事件,不用线程的
jeansfish
2013-07-24 17:26:05 +08:00
async/await
timothyye
2013-07-24 18:46:04 +08:00
放线程里面处理,或者用backgroundworker组件。主ui线程里面这样会让刷新出问题
wzxjohn
2013-07-24 19:16:33 +08:00
當然是開子線程了。。。接受數據的部分用線程處理,終止的時候直接關掉子線程。
Ricepig
2013-07-24 20:48:36 +08:00
非UI线程需要控制UI的时候,需要Invoke

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/76823

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX