一个应用程序:
1、需要周期性获取三种远程数据,且获取周期不同
2、在程序的主界面对数据进行及时更新设计:
1、主界面UI线程独立(用户操作)
2、更新界面的线程Tup独立(定时更新UI界面)
3、三种数据用三个独立的后台线程去定时获取,获取的数据放在三个全局的栈gStack供UI线程取值更新主界面
线程函数用类似的代码:
while(true){sleep(T); doSomething();}
doSomething的主要工作是:获取远程数据,将数据入全局的栈
4、更新界面的线程Tup从gStack取出当前值进行界面更新(treeview,listview的加载)
5、为保持不完整数据造成异常,在三个后台进程对gStack的操作代码和Tup对gStack的操作代码处,使用Lock同步主要目的,大量数据更新界面控件耗时,后台取数据所用时间不定,所以使用多线程。各位高手,看看设计还有什么需要优化改进的地方。

解决方案 »

  1.   

    另外,.net高手请执教,这中线程更新界面控件用那种线程调用安全、高效,
    初学.net,请多多指教。
      

  2.   

    为什么呢
    第2步:如果大量数据添加到控件,让主线程跑的话,会顿住的吧
    没有stack的话,假设Tup尚未更新完成取回来的数据,后台取数据的线程恰好到了更新时间,这样会不正确吧后台取回的数据在array数组中,而且每次取回的元素个数不一定,这样直接在Tup用Arrry数组的话,会有问题吧(两个线程中的Array不是指向同一内存地址)谢谢您的回复
      

  3.   

    我认为可以,不过切记如果UI用Winform, 线程Tup定义和调用一定要在Winform之外。数据交换我用的是dataset.
      

  4.   


    UI用Winform, 线程Tup定义和调用一定要在Winform之外
    这是什么意思呢能具体说说么
      

  5.   

    要gStack干嘛,直接委托操作ui控件
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace WindowsApplication228
    {
        public partial class Form1 : Form
        {
            ListBox LB = new ListBox();        int T1Count = 0;
            int T2Count = 0;
            int T3Count = 0;        public Form1()
            {
                InitializeComponent();            LB.Parent = this;
                LB.Dock = DockStyle.Fill;            new Thread(new ThreadStart(T1)).Start();
                new Thread(new ThreadStart(T2)).Start();
                new Thread(new ThreadStart(T3)).Start();
            }        static Object Obj = new Object();        void AddText(String Text)
            {
                lock (Obj)
                {
                    LB.Items.Add(Text);
                    LB.SelectedIndex = LB.Items.Count - 1; 
                    this.Text = T1Count.ToString() + " " + T2Count.ToString() + " " + T3Count.ToString();
                }
            }        void T1()
            {
                int Start = Environment.TickCount;            while (true)
                    if (Environment.TickCount - Start > 500)
                    {
                        this.Invoke(new Action<String>(AddText), new Object[] { "1-" + ++T1Count });                    Start = Environment.TickCount;
                    }
            }        void T2()
            {
                int Start = Environment.TickCount;            while (true)
                    if (Environment.TickCount - Start > 1000)
                    {
                        this.Invoke(new Action<String>(AddText), new Object[] { "2-" + ++T2Count });                    Start = Environment.TickCount;
                    }
            }        void T3()
            {
                int Start = Environment.TickCount;            while (true)
                    if (Environment.TickCount - Start > 1200)
                    {
                        this.Invoke(new Action<String>(AddText), new Object[] { "3-" + ++T3Count });                    Start = Environment.TickCount;
                    }
            }
        }
    }
      

  6.   

    谢谢wartim的回复
    利用委托更新UI,初学C#,我的理解是这样:
    委托就是一个函数指针(增加了类型等安全检查的函数指针),几个线程使用这个相同的代码块,
    本质上委托相当于另一个线程,独立于UI主线程的,所以可以实现不阻塞主线程界面操作的效果
    这样理解正确么,谢谢