在一个窗体中点一个按钮执行另一个类中的方法
public void PublishAllHouse(List<int> WebId, List<int> HouseId)
        {
            int AllCount = 0;
            try
            {
                //new Thread(() =>
                //{
                //    Control.BeginInvoke(new Action(() =>  
                //    {
                        Thread.Sleep(200);
                        for (int i = 0; i <= HouseId.Count - 1; i++)
                        {
                            for (int j = 0; j <= WebId.Count - 1; j++)
                            {
                                PublishHouseFactory publishhousefactory = new PublishHouseFactory();
                                PublishHouse publishhouse = null;
                                publishhouse = publishhousefactory.CreatePublishHouse(WebId[j].ToString());
                                PublishHouse.WebInfoId = WebId[j];
                                PublishHouse.HouseInfoId = HouseId[i];
                                AllCount++;
                                Thread t = new Thread(new ThreadStart(publishhouse.ToPublishHouse));
                                t.Start();
                                //Thread.Sleep(500);
                                //Control.Invoke((MethodInvoker)delegate
                                //{
                                //    publishhouse.ToPublishHouse();
                                //});
                            }
                        }
                //    }));
                //}).Start();
            }执行这个方法时窗体不能拖动了,怎么解决,谢谢!!

解决方案 »

  1.   

    publishhouse.ToPublishHouse
    这里是不是以开始就要和ui同步,执行Invoke吧所有操作都括进去了?
    线程的目的是尽量释放ui线程占用。
    你检查一下,在必要时候,使用
    this.Invoke((EventHandler)delegate
    {
    //更新ui
    });
    非ui的消耗时间的不要Invoke中写。
    Invoke就把线程和ui线程同步到一起了。
      

  2.   

    在for循环里面开启线程不是一个好的做法,再梳理一下程序逻辑流程,尽量不要这么干
      

  3.   

    PublishAllHouse这个方法的执行不要使用同步,异步解决
      

  4.   

    你的意思线程中创建了窗体?如何创建的?
    哪个窗体要想拖动也是以来消息,你要么一段时间执行Application.DoEvents();要么再开一个线程执行Application.Run(窗体);来单独处理窗体消息。
      

  5.   

    开一个线程,我想你自己原来有思路的,但不知道为什么要改成在循环里不停开线程.
                    new Thread(() =>
                    {
                        for (int i = 0; i <= HouseId.Count - 1; i++)
                        {
                            for (int j = 0; j <= WebId.Count - 1; j++)
                            {
                                PublishHouseFactory publishhousefactory = new PublishHouseFactory();
                                PublishHouse publishhouse = null;
                                publishhouse = publishhousefactory.CreatePublishHouse(WebId[j].ToString());
                                PublishHouse.WebInfoId = WebId[j];
                                PublishHouse.HouseInfoId = HouseId[i];
                                AllCount++;
                                publishhouse.ToPublishHouse();
                            }
                        }                }).Start();