C#程序窗口假死

我第一次编写windows窗口程序(C#),出现窗口假死现象,求解决思路。是这样的,为了完成某个功能,需要顺序完成若干步骤,如果是多线程,不顺序也行,但每次只能执行一个小... 我第一次编写windows窗口程序(C#),出现窗口假死现象,求解决思路。
是这样的,为了完成某个功能,需要顺序完成若干步骤,如果是多线程,不顺序也行,但每次只能执行一个小步骤,其它步骤必须等待当前步骤执行完才能执行。而且每个步骤之间需要加入一定的时间延迟,缓冲一下(必须这么做),按理说:采用以下语句最简洁: 步骤1; sleep();步骤2;sleep()……,但这样会造成窗口假死。最完善的办法可能是创建n个线程,每次延迟一定时间后执行下一线程,好是好,但需要建很多线程。我看到有人实现了自己的delay()方法,替换上述sleep()语句就可以执行,而且不会让窗口假死,不知是怎么实现的。网上搜索了一下,也没弄明白。这个delay方法,先不管它是怎么延时的,它应该让主线程(窗口线程)线程挂起(或等待)一段时间吧? 怎么让窗口线程在等待时不假死呢? 答案直接hi我也算,可以加分100以上,看回答质量了。
几位朋友回答都认真,我就再补充一下,我这个程序是模拟提交网页表单的。比如登录webqq等这类的操作。问题是由Thread.sleep()语句引起的。sleep会造成整个界面假死,但又不能不在两个操作(比如填写用户名算一个操作,填写密码是另一个操作)之间作一些延迟(主要作用是模拟手工操作)。所以延迟是必须的,这不是技术问题,是态度问题(开个玩笑,呵呵)。我看过模拟精灵写的程序,他就是用自己的 delay语句来代替sleep语句,不知是怎么实现的。
展开
 我来答
可以叫我表哥
2015-10-07 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
采纳数:25897 获赞数:1464978
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。

向TA提问 私信TA
展开全部
如果是用控制台的话,是不会有问题的;
如果是用窗体的话,就要用线程。
增加一个引用
using System.Threading;

然后弄一个线程出来

Thread asd = new Thread(abc)
asd.Start();

abc()
{
for(int i = 0;i==i;i++)
{}
}
FantasyChump
2011-06-06 · TA获得超过3288个赞
知道大有可为答主
回答量:2127
采纳率:0%
帮助的人:2243万
展开全部
每次只能执行一个,且步骤之间存在依赖性关系的话,那就不用多个线程,只用一个就可以了。
建议楼主用BackgroundWorker,多个步骤放在一个线程里面就行了。
多个线程还不是一个一个执行的吗?为啥要那么多线程呢,只要一个来保证窗口不假死就行了。
追问
好象是比较好的解决方案,不了解BackgroundWorker,我先了解一下。
今晚了解了一下,看了一下BackgroundWorker的简介,其中有一句话似乎又把我的路堵住了:“您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。” 想想也是,既然把代码写到了非窗口线程中,那就应当和窗口联系不紧密才合理。而我的那些处理工作,却又恰恰要和界面打交道,我又迷茫了……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我爱苏锐
2011-06-06 · TA获得超过1150个赞
知道小有建树答主
回答量:1374
采纳率:0%
帮助的人:830万
展开全部
用个Timer撒,把执行的代码放在Timer的Tick方法里面,然后窗体上的某方法只执行timer1.Start();
就行了.Tick方法第一句写timer1.Stop();下面再放你的代码.
你在窗体上直接Sleep()不是卡UI了么.
更多追问追答
追问
应该是办法之一,不过有很多步骤, 具体要怎么操作呢,也有些麻烦吧?
追答
我上班的时候做读取窗口的时候就是用的这个方法
从数据库读取和遍历都很慢.,我就在Timer里面读取数据库和遍历List,这样就不会影响Form上面用来显示的Panel.
你知道你说的是我的这种情况不
protected void Page_Load(object sender, EventArgs e)
{
timer1.Start();
}
protected void timer1_Tick()
{
timer1.Stop();
……(后面写你说的卡主线程的语句)
}

我正在写个ASP.NET,随手写了下,语句肯定不符合Winform的,你看着情况改改看.
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bensonwong
2011-06-06 · 超过25用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:49.9万
展开全部
主要是因为UI线程被长时间的操作阻塞了。BackgroundWorker算是一种方法。如果不需要太多操作的话,还有一种更简单的方法。就是如果你在UI刷新过程中采用了长时间运算的for循环之类导致阻塞,可以试试在for中每次循环结束时,加一句Application.DoEvent() 。大致应该是这句,记不清了,自己查下。效果可能不如BackgroundWorker好,但是也能凑乎用。
最后只说一句,Vs2005的C# 和 Delphi太像了,应该是设计Delphi的人开发的,不过Vs2008开始已经超越Delphi了,现在的Delphi已是昔日黄花,太不给力了。
追问
言之有理。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
laicaly
高粉答主

2011-06-06 · 醉心答题,欢迎关注
知道小有建树答主
回答量:3001
采纳率:74%
帮助的人:334万
展开全部
用其他线程去处理你要处理的东西,主线程还是做原来的生成窗体操作,我感觉是这样,你可以试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式