回 帖 发 新 帖 刷新版面

主题:BeginInvoke问题?

我做了个类似于任务管理器的程序,想让里面的进程 在后台实时刷新。主要代码如下:
private delegate void myDelegate();
private void Frm_Start_Load(object sender, EventArgs e)
        {
            CreatAppInfo();
            CreateAppHeader();
            myDelegate timeThread = new myDelegate(TimeThread);
            timeThread.BeginInvoke(null, null);
    //TimeThread();    //之前的方法;
         }
        private void TimeThread()
        {
            timer1.Interval = 150;  //time1是我定义的一个Timer类的对象
            timer1.Start();
        }
    private void timer1_Tick(object sender, EventArgs e)
        {
           
            CreatAppInfo();  
            CreateAppHeader();
            listView_App.Refresh();
            CreatProInfor();
            CreatProHead();
            listView_Pro.Refresh();
            
        }
但是运行的时候并没有起到时时刷新的作用,而非要等到鼠标在listView_App和listView_Pro之间相互切换时候才能刷新。而之前我没有用委托,直接LOAD的时候调用TimeThread();方法是可以的,只是UI不友好,经常假死。请问是什么原因?

回复列表 (共4个回复)

沙发

myDelegate timeThread = new myDelegate(TimeThread);
this.BeginInvoke(timeThread, null);
//觉得你那BeginInvoke使用有问题吧!

板凳

Timer控件只会在UI线程运行其事件

BeginInvoke应该用在新建的后台线程中,用于指定运行代码的环境
比如后台线程background中执行this.BeginInvoke(某函数a的委托, ...);
那么a会在创建this的线程上运行(即UI线程)
一般用BeginInvoke都是将任务返回到某个线程

对于本例,你可以把某些处理操作放在后台线程,然后在适当的时候利用BeginInvoke把操纵UI控件的活交给UI线程

3 楼

..看的不是很明白,可否详细些?
我是根据http://www.cnblogs.com/idior/articles/100666.html上面的例子
用Delegate解决(异步调用): 

     public void SetScore(int value) 

     { 

         if (value > 100 || value < 0) 

         { 

              Console.Out.WriteLine("分数不对"); 

         } 

         else 

         { 

              score = value; 

              if (AdviseDelegateInstance!= null) 

              { 

                     AdviseDelegateInstance.BeginInvoke(score,null,null);                     

              } 

         } 

     } 

来仿写的。由于我需要的是它不断的更新。不需要它回调给其他线程,所以后面两个参数都为null。可是就出现了上述问题!

4 楼

那个例子的思路是在新线程中使用BeginInvoke进行异步调用(不干扰当前线程),和我所说的操作是一致的
而你的代码是先异步调用,却很不幸地被Timer打回UI线程,所以实际上所有代码依旧在UI上运行

我来回复

您尚未登录,请登录后再回复。点此登录或注册