Tag: doevents

等待很长的过程并仍在更新UI

我一直在尝试创建一个写入数据库的任务,而不会阻塞UI线程。 我遇到的最大问题是等待该过程完成而不会发生阻塞。 我一直在努力避免使用DoEvents (虽然它现在经常通过这个程序使用,我想在前进时不再使用它)。 我试图创建进程以在第二个线程上运行并等待它完成以及使用BackgroundWorker 。 我遇到的问题不是代码在不同的线程中运行,而是试图找到一种等待它完成的方法。 基本上,现在我做以下事情: 连接到数据库 创建一个后台工作者(或线程)来写入数据库(我可能最终会使用BackgroundWorker所以我可以使用ReportProgress 启动线程或BackgroundWorker 使用While循环等待线程/ BackgroundWorker完成。 对于线程,我等待IsAlive变为false,对于BackgroundWorker ,我切换一个布尔变量。 我让用户知道过程已经完成。 问题在于#4。 执行一个没有代码的while循环,或Thread.Sleep(0)使UI被阻止( Thread.Sleep(0)使程序也占用100%的程序资源) 所以我这样做: while (!thread.IsAlive) Thread.Sleep(1); -要么- while (bProcessIsRunning) Thread.Sleep(1); 它会阻止UI。 如果我在那里调用Application.DoEvents() ,UI会更新(虽然它是可点击的,所以我必须在此过程运行时禁用整个表单)。 如果我同步运行该进程,我仍然需要创建某种方式来更新UI(在我看来,一个DoEvents调用),所以它似乎没有被锁定。 我究竟做错了什么?

DoEvents()在FormClosing中也是邪恶的吗?

在我建议使用的另一个问题上 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { while (processingLock) Application.DoEvents(); } 在FormClosing事件中(在完成冗长的计算后,processingLock立即变为false)。 它应该有助于使应用程序以有序的方式关闭,并且原始海报不使用线程。 根据我建议的答案,有人评论DoEvents永远不会好,提供这个链接: 使用Application.DoEvents() 我读过并且(我认为)理解了这个问题。 在我看来(仍然是noobish)如果我在FormClosing事件中使用如上所述的DoEvents,则没有发生混淆事件的风险 – 如果没有办法取消用户的结束(比如设置e.Cancel = true) 。 我的问题:这是一个有效的方法,以确保应用程序终止良好,如果没有,为什么?

DoEvents()挂起

如何删除此问题? 我原本认为这个问题与DoEvents有关,但事实certificate,事实并非如此。 我在这里转发了这个问题: http : //goo.gl/VpAEK ,更恰当地描述了这个问题。 谢谢 – 我感谢任何关于如何处理这个问题的指导…… 首先,我知道这个问题,因为之前已经提出了一个普遍的概念 – 我(希望)有一个特定的变体要问。 我也将开始说我理解不使用Application.DoEvents()的具体原因,并且尽可能地向所有人保证我们尽可能避免它,并且让多个线程解决问题(没有Application.DoEvents()参与)我们的应用。 话虽如此,它是框架的一部分 – 我认为有一些特定的情况,它有它的位置。 我要问的具体情况是单线程情况,纯粹涉及UI,其中(据我所知),根据定义 – 这不能在后台线程中完成。 更具体地说,我们在表单中加载/配置多个UI元素,有时需要1-2秒才能完成,我希望在此过程中更新标签以指示正在发生的事情。 在后台线程中确实没有任何繁重的工作/工作 – 这都是UI。 如果在4标签文本更改后没有Application.DoEvents()调用,则标签不会重绘自身。 如果有人可以在纯粹的UI, 单线程环境中建议一种能够解决这个问题的替代方案 – 我全都听见了。 问题是,偶尔,在我仍然试图确定的情况下,Application.DoEvents()根本不会返回。 我真的理解所有关于DoEvents()方法的抱怨(大多数都是完全有效的!!!)以及它可能导致的各种问题! 所以,理想情况下,没有进入关于DoEvents调用的优缺点的大辩论(就像这个主题的几乎所有其他线程似乎都这样) – 我想要回答的具体问题是 – 任何人都可以想到任何理由为什么DoEvents会挂起? (即不归)? 如果你想辩论DoEvents()调用本身,这里有一个很好的描述它的优点和缺点: http : //goo.gl/4BtZf 我们的用户报告说,这似乎并没有在他们使用应用程序时发生,而是,只有当他们离开他们的计算机一段时间(屏幕保护程序参与可能?)我们已经注意到它在更改屏幕分辨率时远程查看我们客户的计算机。 我们的用户坚持在应用程序最小化时更多地发生。 我们的用户坚持认为,当应用程序最小化时,它会发生更多,并且他们在IE和/或Outlook中做一些工作。 在内部我们几乎完全无法重现它,除了今天早上我做了以上所有事情,包括禁用我的网络连接一两分钟并连接到服务器几分钟 – 所有这些都是我们的应用程序最小化。 在此之后(字面上我们第一次能够在内部重现它),应用程序挂起,当我附加到进程时,它挂在Application.DoEvents()行上。 2线法: label.Text =“Foo”; Application.DoEvents(); 多个附加测试(尝试执行相同的操作)无法重现该问题。 有什么建议? 谢谢。 […]

避免使用C#中的Application.DoEvents()

许多优秀的程序员(包括很多优秀的Stackoverflow成员)都反对使用Application.DoEvents()无论情况如何。 实际上它甚至得到了网络上大量文章的支持,比如这篇 关于SO的着名辩论 …… 虽然,我陷入了一个案例,其中(I)认为DoEvents()是独特的退出(缺乏经验)。 这就像介绍一样,让我们​​看一些编码。 我有一个’serialPort’组件通过串行通信连接控制器,发送命令并等待它的响应,就是这样。 string response = “”; bool respFlag; private string sendCommand(string command) { respFlag = false; //initialize respFlag serialPort1.Write(command); // send the command Stopwatch timer = Stopwatch.StartNew(); // start a timer while(true) { // break from the loop if receive a response if(respFlag) break; // timeOut error if no response […]

Application.DoEvents()的替代方案

我正在开发一个基于webBrowser控件的消息传递系统,这样我就可以格式化文本了。 当用户离线并发送消息时,将存储消息并在重新登录时为每条消息发送事件。当我为网站设置默认html等时,我通常使用: while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); 这在程序正常运行时有效。 当用户正在接收他们离线时发送的消息时,这会触发下一个消息事件,依此类推,每个消息都会触发,直到最后一个消息。 这意味着它们脱机时发送的最后一条消息是唯一显示的消息。 我想像Application.DoEvents()这样的东西允许控件不断更新和加载,但这不会触发其他事件。 谢谢 编辑: 我通过完全删除DoEvents()来解决问题。 我没有像我工作那样更改DocumentText,而是设置了一个字符串构建器,然后在最后设置html all。

从WebBrowser控件获取ReadyState而不使用DoEvents

这已经在这里以及其他网站和它的工作中多次被忽略了,但是我希望通过其他方式获得想法: 使用导航或发布后获取ReadyState = Complete,而不使用DoEvents因为它的所有缺点。 我还要注意,使用DocumentComplete事件在这里没有帮助,因为我不会只在一个页面上导航,而是像这样一个接一个地导航。 wb.navigate(“www.microsoft.com”) //dont use DoEvents loop here wb.Document.Body.SetAttribute(textbox1, “login”) //dont use DoEvents loop here if (wb.documenttext.contais(“text”)) //do something 今天的方式是使用DoEvents。 我想知道是否有人有正确的方法等待浏览器方法的异步调用,然后继续其余的逻辑。 只是为了它。 提前致谢。