我在窗口上放置了一个自定义控件,这个控件中有个定时器,定时器负责控件的刷新. 但当整个窗口堵塞时(远程调用时),自定义控件就不刷新了. 我想释放可以让自定义的控件拥有一个自己独立的线程,负责刷新自己的控件.
    我看大多数的做法是让界面线程独立出来,invoke一个线程,负责远程调用.但我发现那样修改量太大了.并且只有一个控件需要在堵塞时刷新,所以考虑让一个独立的线程刷新该控件. 但是没有一点思路.
    请大家帮忙!

解决方案 »

  1.   

    to sprc_lcl:
    所以我想让一个独立的线程负责这个控件的界面.而不是用整个窗口界面线程.不知道微软是否把这条路堵死了.
      

  2.   

    独立线程 使用 异步线程
    采用backgroundworker 这个控件 来执行 你的方法。
    绝对满足
      

  3.   

    不是让自定义控件有个独立的线程去刷新,不论是Invoke还是BeginInvoke都没有新开线程,最终还是转给UI线程处理.所以该阻塞还是阻塞.
    正确的做法是应该是让你的远程调用放到线程里去做,或者说让你的远程调用变成异步的.
    不知道有没有接触过WCF,WCF Call基本都是:异步的方法+完成时的回调事件.如果你无法将方法变成异步,那么考虑这样处理以下情况假设在Form中放置一个按钮,处理click事件,Click事件将会做一次远程调用(放入线程池),调用结束会提示"Method call completed"; private void button1_Click(object sender, EventArgs e)
            {
                Action completedAction = () =>
                {
                    this.Invoke(new Action(() => { this.Text = "Method call completed"; }));
                };
                ThreadPool.QueueUserWorkItem
                    (status => 
                    { 
                        //do remote call
                        System.Threading.Thread.Sleep(5000);
                        Action act = status as Action;
                        if (act != null)
                        {
                            act.Invoke();
                        }
                    }, completedAction);
            }
      

  4.   

    to:ly_longyue
       本人比较愚钝,我查了查backgroundworker的用法,还是负责远程调用.不直接负责控件的刷新. 望请教具体的做法.
      

  5.   

    to bloodish:
       你说的方法我考虑过,但是这种方式代码修正的太多,所以不想改.^_^
      

  6.   

    控件都是在UI线程中的呀.怎么会跑到子线程中去,首先你的想法就不对,你应该让你的UI线程只负责显示,子线程来处理事物逻辑,当需要更新UI的时候才去调用UI线程更新,这样主线程又怎么会那么轻易死掉呢.