我打算做一个串口检测软件,在UI上使用了两个listView控件,打算把检测进度显示在listView控件上。现在我把读写串口等等其他操作都封装成了两个过程:
Test(this.listView1,this.serialPort1);和Test(this.listView2,this.serialPort2);
这个两个过程调用的是同一个函数,功能是把进度显示到UI上,只是参数不同而已,现在要求是同时能执行这两个函数,而不是执行完了第一个,然后才执行第二个。简而言之,在界面上我要求能像迅雷下载一样,两个进度条同时能进行。
请问这个功能在多线程中怎样才能实现?

解决方案 »

  1.   

    首先Test这个函数肯定不能跑在UI线程上,因为UI线程只有一个,如果Test跑在UI上,那你说的两个过程只能一先以后所以你需要写一个专门更新UI的函数,这个函数是跑在UI线程上的
    比如:
    void UpdateUI(ListView listView, string message){
        ....
    }然后在
    Test这个函数需要更新UI的时候调用
    this.Invoke(...)这个函数来在UI线程上执行UpdateUI方法
      

  2.   

    Test1(this.listView1,this.serialPort1);
    Test2(this.listView2,this.serialPort2);
    两个线程同时开启,使用UI委托控制进度条即可。在线程中是不能直接操作UI控件的,用Invoke方法
      

  3.   

    你的更新UI的委托一次肯定只能运行一个所以你需要将更新UI的操作分解就是说你不能吧Test函数做为委托直接Invoke而是在Test函数中需要更新UI的时候,比如进度发生变化的时候才能更新UI,并且更新UI的委托不应该执行太长时间
      

  4.   

    不要把整个方法都委托给主线程做。
    方法还是由子线程做,只是遇到UI更新时用下面的语句
    this.Invoke(new MethodInvoker(delegate() {……method……}));  或者
    contorlname.Invoke(new MethodInvoker(delegate() {……method……}));