V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jackyzy823
V2EX  ›  .NET

请教一个C#的问题。。

  •  
  •   jackyzy823 · 2013-07-24 15:08:30 +08:00 · 3869 次点击
    这是一个创建于 4125 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在我想做一个界面,有1个textbox,和两个button ,一个button是开始,点击后,开始接受数据[从串口],并显示在textbox里,另一个button 是停止,即停止上述的操作。
    现在的问题是:
    单纯的在开始的那个函数中用无限循环来接受数据的话,会导致整个界面都卡死,就无法点击停止的button,也就无法终止。

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

    请问V上的各位,应该如何解决。。。
    9 条回复    1970-01-01 08:00:00 +08:00
    66450146
        1
    66450146  
       2013-07-24 15:11:13 +08:00   ❤️ 1
    Control.Invoke
    cxe2v
        2
    cxe2v  
       2013-07-24 15:14:20 +08:00   ❤️ 1
    创建一个子线程用来接收数据,每接收一次返回一个值用来指示主线程刷新textbox,
    timonwong
        3
    timonwong  
       2013-07-24 15:16:49 +08:00   ❤️ 1
    方法多了
    1. 调用GUI部分使用MethodInvoker把委托给GUI线程调用,这个耦合比较重,不过对知识点没啥要求。(当然处理部分可以BackgroundWorker, Thread, TPL等等)。
    2. Reactive Extensions,这个写习惯了就相当方便,要求你换换脑子。
    msg7086
        4
    msg7086  
       2013-07-24 16:43:08 +08:00   ❤️ 1
    Thread.Start
    this.Invoke
    nybux
        5
    nybux  
       2013-07-24 16:59:39 +08:00   ❤️ 1
    c#做串口,不知道你用的是不是SerialPort,有个DataReceived的事件,不用线程的
    jeansfish
        6
    jeansfish  
       2013-07-24 17:26:05 +08:00   ❤️ 1
    async/await
    timothyye
        7
    timothyye  
       2013-07-24 18:46:04 +08:00 via Android   ❤️ 1
    放线程里面处理,或者用backgroundworker组件。主ui线程里面这样会让刷新出问题
    wzxjohn
        8
    wzxjohn  
       2013-07-24 19:16:33 +08:00   ❤️ 1
    當然是開子線程了。。。接受數據的部分用線程處理,終止的時候直接關掉子線程。
    Ricepig
        9
    Ricepig  
       2013-07-24 20:48:36 +08:00   ❤️ 1
    非UI线程需要控制UI的时候,需要Invoke
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1638 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:57 · PVG 00:57 · LAX 08:57 · JFK 11:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.