当前位置:编程学习 > C#/ASP.NET >>

解决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()实施有没有效果 --------------------编程问答--------------------
引用 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 --------------------编程问答--------------------
引用 2 楼 qq873113580 的回复:
do1()
{
dowork1();
// 做其他事
dowork2();
// 做其他事
dowork3();
}
把这个房到一个线程里面 就不会卡死了


执行完dowork1后需要回到do1中执行其他工作,这个工作需要对窗口进行操作 --------------------编程问答--------------------
引用 3 楼 zhs23 的回复:
顶1楼,线程1里,执行完后,开启线程2,执行完后,开启线程3


谢谢,但是问题是如何控制线程结束后再执行剩下的语句.有什么办法得知线程已经结束?


我现在关键是要解决窗口假死的问题.

或者有什么办法可以在线程中控制窗体的控件?

如果我用backgroundWorker来控制每个dowork,不知道是不是同用Thread的效果一样.

backgroundWorker是否是等待执行完后再执行剩下的语句?
--------------------编程问答-------------------- backgroundWorker 类似于 Thread,

要知道线程什么时候执行完?你不用管他什么时候执行完。
在线程1里的代码。最后一句后面加上 开启线程2的 就可以了。

他执行完了就自动执行线程2了

--------------------编程问答--------------------


用线程调用 : 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.
});
}
--------------------编程问答-------------------- 用lock锁 --------------------编程问答--------------------
引用 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中如何与其他控件交换数据?  --------------------编程问答-------------------- doevernts --------------------编程问答-------------------- 有状态 无法用这种多线程 --------------------编程问答-------------------- 实在搞不明白就把三个方法放在一个线程里依次执行
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,