解决winform卡死的问题
我现在有一些运行比较耗时的方法,需要依次执行,如果我依次执行这些方法,那么窗口容易卡死.如果我开线程去运行方法,那么就变成并行运行了.有什么办法解决?
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(),又不会造成窗口假死? winform 线程 thread --------------------编程问答-------------------- //这样运行会卡死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,以此类推 --------------------编程问答-------------------- do1()
{
dowork1();
// 做其他事
dowork2();
// 做其他事
dowork3();
}
把这个房到一个线程里面 就不会卡死了 --------------------编程问答-------------------- 顶1楼,线程1里,执行完后,开启线程2,执行完后,开启线程3 --------------------编程问答-------------------- 如果是频繁操作界面元素可以在所有操作前调用this.SuspendLayout(),操作完再调用this.ResumeLayout()实施有没有效果 --------------------编程问答--------------------
卡死是由于操作时间长,如果移动窗口就会造成假死
执行t1后需要执行其他工作,需要等工作执行完后再执行t2 --------------------编程问答--------------------
执行完dowork1后需要回到do1中执行其他工作,这个工作需要对窗口进行操作 --------------------编程问答--------------------
谢谢,但是问题是如何控制线程结束后再执行剩下的语句.有什么办法得知线程已经结束?
我现在关键是要解决窗口假死的问题.
或者有什么办法可以在线程中控制窗体的控件?
如果我用backgroundWorker来控制每个dowork,不知道是不是同用Thread的效果一样.
backgroundWorker是否是等待执行完后再执行剩下的语句?
--------------------编程问答-------------------- backgroundWorker 类似于 Thread,
要知道线程什么时候执行完?你不用管他什么时候执行完。
在线程1里的代码。最后一句后面加上 开启线程2的 就可以了。
他执行完了就自动执行线程2了
--------------------编程问答--------------------
--------------------编程问答-------------------- 用lock锁 --------------------编程问答--------------------
用线程调用 : 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中如何与其他控件交换数据? --------------------编程问答-------------------- doevernts --------------------编程问答-------------------- 有状态 无法用这种多线程 --------------------编程问答-------------------- 实在搞不明白就把三个方法放在一个线程里依次执行
补充:.NET技术 , C#