【求助】 调用复杂方法时Winform界面卡死问题

DanteLzp 2017-04-04 12:24:26
现在有一个计算量比较大的方法ConnectSDE(),本意是在调用ConnectSDE()时Form2添加一个等待界面的动画表示程序正在等待,基本逻辑是

private void buttonX1_Click(object sender, EventArgs e)//button1在form1种
{
Form2 form2 = new Form2();
form2.show();//form2加载时有等待动画
ConnectSDE();//运行时间5秒左右
form2.hide();//等待界面消失,回到主界面
}

然而在运行ConnectSDE();时form2处于卡死状态,不能显示窗体内动画。
求助怎样能使ConnectSDE();不阻塞form2动画的显示?(用进程搞了半天总是有问题,真心求助)
...全文
447 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
死抠“等待界面消失”这种字眼儿,假设你按照字眼儿来找编程语句,而不去理解其内部实质,会被盲目照抄编程语句的行为让你丧失真正的异步流程设计能力。当你在画流程图、进行时序设计,等等设计方面,你还是有迷惑的思维方式,无法进行良好的设计。 编程语句形式不是最重要的,你要从流程图设计、从“心里”就把顺序逻辑跟异步逻辑能够分开理解。
  • 打赏
  • 举报
回复
“等待”这个说法本身就是不靠谱的。假设一个窗体显示动画,另一个窗体执行“耗时计算”,那么计算完毕之后应该进行事件/回调通知操作,form2.hide() 要放到 ConnectSDE() 方法结束之后异步回调时才执行,这样才能谈到如何更好地安排流程的问题。而“死等”逻辑本身,不用看代码,仅仅看逻辑,就是不可行的。 不管代码怎么用各种繁琐的方式编程,你的逻辑要先靠谱,你要知道这里是异步操作设计模式。
DanteLzp 2017-04-05
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
死抠“等待界面消失”这种字眼儿,假设你按照字眼儿来找编程语句,而不去理解其内部实质,会被盲目照抄编程语句的行为让你丧失真正的异步流程设计能力。当你在画流程图、进行时序设计,等等设计方面,你还是有迷惑的思维方式,无法进行良好的设计。 编程语句形式不是最重要的,你要从流程图设计、从“心里”就把顺序逻辑跟异步逻辑能够分开理解。
恩恩说的很对 给你拜个早年吧!
southmay 2017-04-04
  • 打赏
  • 举报
回复
不知道你具体的实施方法,但可以试着采用backgroundworker中加载Form2和ConnectSDE(),然后Form2采用showdialog()模式。在ConnectSDE()执行完毕后,发送消息给form2.hide()试试看
xuzuning 2017-04-04
  • 打赏
  • 举报
回复
不能用线程,本意就是要等待的
private void buttonX1_Click(object sender, EventArgs e)//button1在form1种
{
     Form2 form2 = new Form2();
     form2.show();//form2加载时有等待动画
     Application.DoEvent(); //交出控制权,让 Form2 显示出来
     ConnectSDE(); //运行时间5秒左右
     form2.hide();//等待界面消失,回到主界面
}
john_QQ:2335298917 2017-04-04
  • 打赏
  • 举报
回复
用多线程处理耗时操作,用委托更新界面也可以
Forty2 2017-04-04
  • 打赏
  • 举报
回复
Winform的‘等待窗口’模式大致如下: 0、在UI中创建等待窗口 1、异步开始‘耗时’任务 2、显示等待窗口 3、‘耗时’任务完成时,关闭等待窗口

private void buttonX1_Click(object sender, EventArgs e)
{
    using (var form = new Form()) // 0
    {
        form.Size = new Size(200, 120);
        form.StartPosition = FormStartPosition.CenterParent;
        form.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        form.ControlBox = false;
        form.Text = "加载中...";
        Task.Run(() => // 1
        {
            try
            {
                ConnectSDE();
            }
            finally
            {
                try { form.Invoke((Action)form.Close); } catch { } // 3
            }
        });
        form.ShowDialog(this);  // 2
    }
}
void ConnectSDE() { Thread.Sleep(5000); }
wanghui0380 2017-04-04
  • 打赏
  • 举报
回复
给你几个关键字“Task wait continuewith”,你可以用百度搜搜看,看你自己能解决不,如果不能解决,我们在帮忙
  • 打赏
  • 举报
回复
实现异步线程,你可以试试用委托的方法
Forty2 2017-04-04
  • 打赏
  • 举报
回复
引用 5 楼 DanteLzp 的回复:
... 感谢啊 我用的是vs2010 没有Task.Run。我用Task.Factory.StartNew实现了。这俩应该没啥区别吧==
对你的应用,没有区别。
江南小鱼 2017-04-04
  • 打赏
  • 举报
回复
引用 5 楼 DanteLzp 的回复:
[quote=引用 2 楼 Forty2 的回复:] Winform的‘等待窗口’模式大致如下: 0、在UI中创建等待窗口 1、异步开始‘耗时’任务 2、显示等待窗口 3、‘耗时’任务完成时,关闭等待窗口

private void buttonX1_Click(object sender, EventArgs e)
{
    using (var form = new Form()) // 0
    {
        form.Size = new Size(200, 120);
        form.StartPosition = FormStartPosition.CenterParent;
        form.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        form.ControlBox = false;
        form.Text = "加载中...";
        Task.Run(() => // 1
        {
            try
            {
                ConnectSDE();
            }
            finally
            {
                try { form.Invoke((Action)form.Close); } catch { } // 3
            }
        });
        form.ShowDialog(this);  // 2
    }
}
void ConnectSDE() { Thread.Sleep(5000); }
感谢啊 我用的是vs2010 没有Task.Run。我用Task.Factory.StartNew实现了。这俩应该没啥区别吧==[/quote] 线程处理上有区别
DanteLzp 2017-04-04
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
Winform的‘等待窗口’模式大致如下: 0、在UI中创建等待窗口 1、异步开始‘耗时’任务 2、显示等待窗口 3、‘耗时’任务完成时,关闭等待窗口

private void buttonX1_Click(object sender, EventArgs e)
{
    using (var form = new Form()) // 0
    {
        form.Size = new Size(200, 120);
        form.StartPosition = FormStartPosition.CenterParent;
        form.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        form.ControlBox = false;
        form.Text = "加载中...";
        Task.Run(() => // 1
        {
            try
            {
                ConnectSDE();
            }
            finally
            {
                try { form.Invoke((Action)form.Close); } catch { } // 3
            }
        });
        form.ShowDialog(this);  // 2
    }
}
void ConnectSDE() { Thread.Sleep(5000); }
感谢啊 我用的是vs2010 没有Task.Run。我用Task.Factory.StartNew实现了。这俩应该没啥区别吧==

110,567

社区成员

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

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

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