none
c# 多线程 RRS feed

  • 问题

  • 我在winform 中用多线程,需要访问winform里的控件属性,用了Control.Invoke 这个方法,可是界面就不动了,就卡到那了,不是多线程吗?应该是界面正常啊,我切换一下界面就卡到那了
    2009年5月31日 14:57

答案

全部回复

  • 你好!
         请问可以提供相关代码吗?
    周雪峰
    2009年5月31日 15:06
    版主
  • 用 Control.BeginInvoke
    MCPD (Windows & Web)
    2009年5月31日 16:36
  •  private delegate void GetFileList();
      private void button2_Click(object sender, EventArgs e)
            {new Thread(Work).Start();}
    public void Work()
            {
                while (true)
                {
                    if (this.InvokeRequired)
                    {
                        GetFileList GetFL = new GetFileList(Work);
                        this.Invoke(GetFL);
                    }
                    else
                    {
                        progressBar1.Value = 0;
                    }
                    Thread.Sleep(10000);
                  
                }
            }就是这样的,我让他等待,窗体就显示不出来了
    2009年6月1日 0:44
  • 这样试试:
    private delegate void GetFileList();
      private void button2_Click(object sender, EventArgs e)
            {new Thread(Work).Start();}
    public void Work()
            {
                while (true)
                {
                    if (this.InvokeRequired)
                    {
                        GetFileList GetFL = new GetFileList(Work);
                        this.BeginInvoke(GetFL);
                    }
                    else
                    {
                        progressBar1.Value = 0;
                    }
                    Thread.Sleep(10000);
                  
                }
            }
    周雪峰
    2009年6月1日 0:51
    版主
  • 我是了,还是不行,界面还是显示不出来
    2009年6月1日 1:06
  • 我是了,还是不行,界面还是显示不出来

    你好对于你的代码
    if (this.InvokeRequired)
    这里的this.InvokeRequired始终为false的
    这说明当前的线程是主线程,而不是你自己的线程
    Thread.Sleep(10000);
    就是将当前主线程Sleep10秒,这样当然会导致你的窗口绘制不出来

    private delegate void GetFileList();
          private delegate void DoSomething();
          private void button2_Click(object sender, EventArgs e)
          {
             Thread.CurrentThread.Name = "mainThread";
             Thread thread = new Thread(Work);
             thread.Name = "myThread";
             thread.Start();
          }
    
          private object obj = new object();
    
          public void Work()
          {
             int i = 1;
             while (true)
             {
                if (IsHandleCreated)
                {
                   if (this.InvokeRequired)
                   {
                      DoSomething doSomething = delegate()
                      {
                         this.Text = Thread.CurrentThread.Name;
                         lock (obj)
                         {
                            if (this.progressBar1.Value < 100)
                            {
                               this.progressBar1.Value += 1;
                            }
                         }
                         i++;
                      };
                      this.BeginInvoke(doSomething);
    
                      //GetFileList GetFL = new GetFileList(Work);
                      //this.BeginInvoke(GetFL);
                   }
                   else
                   {
                      //progressBar1.Value = 0;
                      //Thread.Sleep(10000);
    
    
                   }
                   if (i > 100)
                   {
                      break;
                   }
                }
    
             }

    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年6月1日 2:20
    版主
  • 还是不行啊,.InvokeRequired也是始终为false的
    2009年6月1日 2:41
  • 还是不行啊,.InvokeRequired也是始终为false的

    请注意这里:
     Thread.CurrentThread.Name = "mainThread";
             Thread thread = new Thread(Work);
             thread.Name = "myThread";
             thread.Start();
    我修改成这样就可以了,不晓得为什么,真是奇怪
    new Thread(Work).Start();你的这个按理说是可以的
    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年6月1日 2:47
    版主
  • 还是为false 啊
    2009年6月1日 2:51
  • 还是为false 啊

    我这里都是okay的啊

    http://hi.baidu.com/1987raymond/album/item/8681980ff75ad3c8ab645791.html

    你确认你是修改成我刚才那段代码了吗
    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    • 已标记为答案 mister55 2009年6月1日 7:28
    • 取消答案标记 mister55 2009年6月1日 7:28
    2009年6月1日 2:58
    版主
  • 我用backgroundWorker解决了

    • 已标记为答案 mister55 2009年6月1日 7:28
    2009年6月1日 7:28