在C#中执行其他操作时表单无响应我有一个表单(使用VS2010在C#中开发)和一个进度条。这是一种秒表形式,我在其中填充进度条说10秒....随着时间的流逝,进度条相应地填充....意思是在5秒后进度条将填充50%等....我使用for循环执行此操作:-for(intcount=0;count<200;count++){progbar.performstep();progbar.update();更新();线程.睡眠(50);我使用Thread.Sleep50毫秒,以便进度条顺利更新。持续1秒,它会递增。问题是,如果我做任何其他事情,比如移动此表单,甚至单击桌面上的另一个图标,它会使此表单“无响应”......但它会在10秒结束时恢复其状态并显示弹出指示进度条已满10秒。感谢您的帮助,对于复杂的语言,我们深表歉意。真诚的,Swanand更新:我在下面的答案的帮助下解决了这个问题....我知道的一个常见错误是忘记了“Applications.DoEvents()”和“update()”......如果你输入这一行,在那里被“绞死”的机会更少!您在UI线程上执行长时间运行的操作,这意味着UI“消息循环”(负责处理用户输入和更新屏幕等事件)无法运行。您应该在不同的线程(无论是您自己创建还是后台线程)上执行长时间运行的操作,并使用BackgroundWorker轻松更新进度条,或使用Control.Invoke/BeginInvoke根据需要将委托调用重新编组回UI更新UI时间线程。(您不能从错误的线程更新控件。)如果您唯一的UI交互是填写进度条,我建议使用BackgroundWorker。如果您实际上并不是在做“真正的”工作,只是在等待时间流逝,您可以使用System.Windows.Forms.Timer而不是所有这些。这将在UI线程上“滴答”,但不会在滴答之间阻塞UI线程。如果你没有太多事情要做,你应该只使用它-如果它真的只是更新进度条,而不是(比如)处理文件等。请注意,你不应该依赖计时器来“准时”触发-您应该根据观察到的时间而不是观察到的刻度数来设置进度条的位置。你阻塞了UI线程,这意味着它不处理像“paint”这样的事件。要正确地做到这一点,你应该使用BackgroundWorker的东西,并且只从进度事件更新UI。使用系统;使用System.Windows.Forms;使用System.ComponentModel;使用系统线程;静态类程序{[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);应用程序运行(新的MyForm());}}classMyForm:Form{Buttonbtn;BackgroundWorker工人;ProgressBar栏;publicMyForm(){Controls.Add(btn=newButton{Text="Clickme"});btn.Click+=newEventHandler(btn_Click);Controls.Add(bar=newProgressBar{Dock=DockStyle.Bottom,Visible=false,Minimum=0,Maximum=100});worker=newBackgroundWorker{WorkerReportsProgress=true};worker.ProgressChanged+=newProgressChangedEventHandler(worker_ProgressChanged);worker.DoWork+=newDoWorkEventHandler(worker_DoWork);worker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);}voidworker_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){bar.Visible=假;if(e.Error!=null){Text=e.Error.Message;}elseif(e.Cancelled){Text="cancelled";}else{Text=e.Result==null?“完成”:e.Result.ToString();}btn.Enabled=true;}voidworker_DoWork(objectsender,DoWorkEventArgse){for(intcount=0;countyouareblockingthemainUIthread您可以使用后台工作者来执行此操作。您可以在MSDN中找到更多详细信息Marc建议的答案将有所帮助.lonrun操作可能会使你的应用程序崩溃或变得无响应。我有一篇关于使用后台工作者类的博客文章。http://midnightprogrammer.net/post/Using-Background-Worker-in-C.aspx如果你要运行代码,你应该把这段代码放在一个函数中,并用一个线程调用这个函数。publicstaticvoidfun1(){for(inti=0;ib'cazThread.sleep(100)将停止整个上下文而不是你想要的...以上是C#学习教程:在C#中做任何其他事情时表单不响应所有分享的内容。如果对你有用,你还需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击维权联系管理员删除。如需转载,请注明出处:
