解决方案 »

  1.   

    请贴出 XX 和 XXX 方法的实现代码
      

  2.   

    XX(){
    do
    {
    //获取数据
    Thread.Sleep(2000);//获取一次数据睡眠2S
    }while(true);
    }XXX()
    {
    do
    {
    //委托刷新数据
    Thread.Sleep(5000);//5S刷新一次数据
    }while(true);
    }
      

  3.   

    @gzyyan249也就是说刷新数据的代码,执行一次就不执行了,请问是 WinForm 项目么,刷新窗口显示?那么是否碰到在非窗口创建线程中直接修改窗口控件属性,而导致异常而该线程退出了呢?请贴出修改窗口内容的代码,或者尝试使用Invoke方法,从而在窗口基础句柄创建线程中对窗口数据进行修改。
      

  4.   

    是 WinForm 项目,是普通类用委托的方法刷新UI类,伪代码如下:
    A
    {
    public delegate void refleshStationUI(List<string[]> stationEquInfo, List<ListViewItem> equListViewItem, bool isPlay, bool isSubString91, int monitorErrorCount, StationLayoutDoc sld);
    public refleshStationUI _refleshUI;
           
    XXX()
    {
     _refleshUI(stationEquInfo,equListViewItem,  isPlay, isSubString91,  monitorErrorCount, sld);}
    }UI
    {
    void C(){
    A a = new A(station, doc, this);
    a.XX();
    a._refleshUI = new a.XXX(ThreadFlushUI);
    }public void ThreadFlushUI(List<string[]> equInfo, List<ListViewItem> equListViewItem, bool isPlay, bool isSubstring91, int monitorErrorCount, StationLayoutDoc sld)
     {
    //实现界面刷新
    }}
      

  5.   


    @gzyyan249 使用try...catch...
    实现界面刷新的代码,是否有异常发生?如果产生InvalidOperationException,并且提示为线程间操作无效....那么请用 Invoke,示例:
           private void Form1_Load(object sender, EventArgs e)
            {
                var t = new System.Threading.Thread(() =>
                {
                    //try
                    //{
                    //    this.Text = "直接在其它线程中赋值为发生InvalidOperationException";
                    //}
                    //catch(InvalidOperationException ex)
                    //{                //}                this.Invoke(new Action(() =>
                    {
                        this.Text = "从另一条线程,使用Invoke方法,在拥有此控件的基础窗口句柄的线程上执行指定的委托。";
                    }));
                });
                t.Start();
            }
      

  6.   

    如果你不是在采集数据的线程里想直接控制UI,而是异步的,你还是放到主线程的timer里好了,何必再开一个线程呢
      

  7.   

    你应该是说,两个线程调用了一个方法吧?
    给两个线程起个名字
    T1.Name = "线程1";在循环里判断
    where (1=1)
    {      ......
         .......
          if  (Thread.CurrentThread.Name == "线程1") break;
    }还有楼上说的加锁也是有必要的.
      

  8.   

    XX(){
    do
    {
    //获取数据
    Thread.Sleep(2000);//获取一次数据睡眠2S
    }while(true);
    }XXX()
    {
    do
    {
    //委托刷新数据
    Thread.Sleep(5000);//5S刷新一次数据
    }while(true);
    }
    请填写完整代码上面的仁兄一个个说什么加lock,我想请问lock 谁? 如果你的xx和xxx是内容只有这些,我保证你的两个现正永久无限死循环,跳出应该是你的XXX里面的代码异常了一般有多个线程同时更改一个对象的时候才需要加lock