解决winform卡死的问题

Neo_Xiao 2013-09-29 03:26:20
我现在有一些运行比较耗时的方法,需要依次执行,如果我依次执行这些方法,那么窗口容易卡死.如果我开线程去运行方法,那么就变成并行运行了.有什么办法解决?


dowork1(){}
dowork2(){}
dowork3(){}

//这样运行会卡死
do1()
{
dowork1();
// 做其他事
dowork2();
// 做其他事
dowork3();
}

//这样不能按顺序执行
do1()
{
Thread t1 = new Thread(new ThreadStart(dowork1));
t1.Start();
// 做其他事
Thread t2 = new Thread(new ThreadStart(dowork2));
t2.Start();
// 做其他事
Thread t3 = new Thread(new ThreadStart(dowork3));
t3.Start();
}


有什么办法在执行完dowork1()后再执行dowork2(),又不会造成窗口假死?
...全文
565 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaoshiyao 2013-09-30
  • 打赏
  • 举报
回复
有状态 无法用这种多线程
TryToday 2013-09-30
  • 打赏
  • 举报
回复
doevernts
Neo_Xiao 2013-09-30
  • 打赏
  • 举报
回复
引用 9 楼 zhs23 的回复:


用线程调用 : Dele()

private delegate void DelegateMain();

        public void Dele()
        {
            DelegateMain caller = new DelegateMain(Body);
            IAsyncResult result = caller.BeginInvoke(new AsyncCallback(CallBackResult), null);
            Thread.Sleep(0);
        }
private void Body()
{
这里处理程序,数据。不要与UI互动
}

        private void CallBackResult(IAsyncResult ar)
        {
            AsyncResult result = (AsyncResult)ar;
            DelegateMain caller = (DelegateMain)result.AsyncDelegate;
            caller.EndInvoke(ar);

            Invoke((MethodInvoker)delegate
            {
//这里是处理与UI的。及返回结果。
再开始同样的调用 线程2.
});
}
额额 悲剧 还不会委托呢... Dele()如果放在其他类里面,通过按钮事件调用,那在CallBackResult中如何与其他控件交换数据?
wangjcltj 2013-09-30
  • 打赏
  • 举报
回复
实在搞不明白就把三个方法放在一个线程里依次执行
专业程序员 2013-09-29
  • 打赏
  • 举报
回复
用lock锁
迷迷520 2013-09-29
  • 打赏
  • 举报
回复


用线程调用 : Dele()

private delegate void DelegateMain();

        public void Dele()
        {
            DelegateMain caller = new DelegateMain(Body);
            IAsyncResult result = caller.BeginInvoke(new AsyncCallback(CallBackResult), null);
            Thread.Sleep(0);
        }
private void Body()
{
这里处理程序,数据。不要与UI互动
}

        private void CallBackResult(IAsyncResult ar)
        {
            AsyncResult result = (AsyncResult)ar;
            DelegateMain caller = (DelegateMain)result.AsyncDelegate;
            caller.EndInvoke(ar);

            Invoke((MethodInvoker)delegate
            {
//这里是处理与UI的。及返回结果。
再开始同样的调用 线程2.
});
}
迷迷520 2013-09-29
  • 打赏
  • 举报
回复
backgroundWorker 类似于 Thread, 要知道线程什么时候执行完?你不用管他什么时候执行完。 在线程1里的代码。最后一句后面加上 开启线程2的 就可以了。 他执行完了就自动执行线程2了
Neo_Xiao 2013-09-29
  • 打赏
  • 举报
回复
引用 3 楼 zhs23 的回复:
顶1楼,线程1里,执行完后,开启线程2,执行完后,开启线程3
谢谢,但是问题是如何控制线程结束后再执行剩下的语句.有什么办法得知线程已经结束? 我现在关键是要解决窗口假死的问题. 或者有什么办法可以在线程中控制窗体的控件? 如果我用backgroundWorker来控制每个dowork,不知道是不是同用Thread的效果一样. backgroundWorker是否是等待执行完后再执行剩下的语句?
Neo_Xiao 2013-09-29
  • 打赏
  • 举报
回复
引用 2 楼 qq873113580 的回复:
do1() { dowork1(); // 做其他事 dowork2(); // 做其他事 dowork3(); } 把这个房到一个线程里面 就不会卡死了
执行完dowork1后需要回到do1中执行其他工作,这个工作需要对窗口进行操作
Neo_Xiao 2013-09-29
  • 打赏
  • 举报
回复
引用 1 楼 sj490790083 的回复:
//这样运行会卡死do1(){dowork1();// 做其他事dowork2();// 做其他事dowork3();}卡死的原因是什么,做了什么操作
 //这样不能按顺序执行do1(){Thread t1 = new Thread(new ThreadStart(dowork1));t1.Start();// 做其他事Thread t2 = new Thread(new ThreadStart(dowork2));t2.Start();// 做其他事Thread t3 = new Thread(new ThreadStart(dowork3));t3.Start();}
你可以等t1的操作执行到最后 再去把t2 Start,以此类推
卡死是由于操作时间长,如果移动窗口就会造成假死 执行t1后需要执行其他工作,需要等工作执行完后再执行t2
sj490790083 2013-09-29
  • 打赏
  • 举报
回复
如果是频繁操作界面元素可以在所有操作前调用this.SuspendLayout(),操作完再调用this.ResumeLayout()实施有没有效果
迷迷520 2013-09-29
  • 打赏
  • 举报
回复
顶1楼,线程1里,执行完后,开启线程2,执行完后,开启线程3
Teln_小凯 2013-09-29
  • 打赏
  • 举报
回复
do1() { dowork1(); // 做其他事 dowork2(); // 做其他事 dowork3(); } 把这个房到一个线程里面 就不会卡死了
sj490790083 2013-09-29
  • 打赏
  • 举报
回复
//这样运行会卡死do1(){dowork1();// 做其他事dowork2();// 做其他事dowork3();}卡死的原因是什么,做了什么操作
 //这样不能按顺序执行do1(){Thread t1 = new Thread(new ThreadStart(dowork1));t1.Start();// 做其他事Thread t2 = new Thread(new ThreadStart(dowork2));t2.Start();// 做其他事Thread t3 = new Thread(new ThreadStart(dowork3));t3.Start();}
你可以等t1的操作执行到最后 再去把t2 Start,以此类推

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧