的DoEvents()挂(DoEvents() hanging)

2019-07-30 12:14发布

如何删除这个问题吗? 我原本以为,这个问题涉及到的DoEvents,但事实证明,事实并非如此。 :我在这里转贴的问题http://goo.gl/VpAEK与问题的更恰当的描述。

谢谢 - 我很欣赏该如何处理这个任何指导...


首先,我知道这个问题,作为一个总的概念已经被问过 - 我(希望)特定变异询问。 我也将开始在说,我明白具体原因不使用Application.DoEvents(),并确保每个人都摆在最前头,我们避免它只要有可能,并且有多个线程解决问题(不Application.DoEvents()的参与)在整个我们的应用程序。

话虽这么说,它是框架的一部分-我认为有在它有它的地方的具体情况。

我想咨询一下具体情况是单个线程的情况下,与纯粹的参与,其中(据我所知),通过定义用户界面 - 这不能在后台线程来完成。 更具体地讲,我们加载/的形式,配置一些UI元素,有时需要1-2秒即可完成,我希望有一个标签,在此过程中,指示正在发生的事情进行更新。 是不是真的有在后台线程做任何繁重/工作 - 这一切都UI。

如果我没有一个Application.DoEvents()调用的4个标签文本更改后,标签不重绘自身。 如果有人认为,在纯粹的UI, 单线程环境不同的解决了这个替代-我所有的耳朵。

问题是,零星的,因为我仍然试图牵制的情况下,Application.DoEvents()根本没有返回。

我真的了解所有有关的DoEvents投诉()方法(其中大部分是完全有效的!!!)和各种问题,它可能会导致! 因此,理想情况下,没有进入的利弊一个巨大的辩论/中的DoEvents的利弊调用(因为几乎对这个话题所有其他线程似乎做) - 我绑来回答的具体问题是 - 任何人都可以想到的任何原因为什么会的DoEvents只是挂? (即不归)?

如果要辩论的DoEvents()调用自身,有其长处和短处的伟大的描述在这里: http://goo.gl/4BtZf

  • 我们的用户报告,这似乎并没有发生,而他们正在使用的应用,而是只有当他们放弃自己的电脑走了一会儿(屏幕保护程序的参与也许?)改变屏幕分辨率,而当我们已经注意到了这一点远程查看客户的电脑。
  • 我们有坚持的应用程序最小化,当它发生更多的用户。
  • 我们有坚持的应用程序最小化,当它发生更多的用户,和他们做在IE和/或前景的一些工作。

我们内部已经几乎完全无法重现它,除了今天上午的时候我做了所有上述功能,包括停用了一两分钟,我的网络连接和VPNing到服务器几分钟 - 同时我们的应用程序最小。

这个(字面第一次,我们已经能够重现它在内部)后,应用程序挂起,当我连接到这个过程中,它被挂在Application.DoEvents()线。 2线方法:

label.Text = “foo” 的; Application.DoEvents();

多额外的测试,(试图执行相同的操作)无法重现该问题。

有什么建议? 谢谢。


编辑:这是禁忌,试图得到答案的一个问题特别是约的DoEvents? 我是比较新的StackOverflow的,我只是有点搞不清楚为什么我已经得到了两轮投票。

我已经看到了这个问题问了很多次其他线程,和(我的眼睛至少,几乎普遍反应只是 - 不要使用application.DoEvents())。 我特别想在我原来的问题体贴,并解释为什么我们在这种情况下使用它。 同时,我特别想避免的,为什么不应该使用的DoEvents另一个讨论。 如果有足够多的人认为有些东西是一个坏主意,它只是忌讳讨论的计算器? 同样,我是比较新的这个论坛,并试图在这里了解在作怪礼仪。 谢谢。

Answer 1:

这是不正确的假设,这将是错误的,利用其他[背景]线程来执行这个任务。 如果你想追求的路径Application.DoEvents这很好。 我不会坐在这里告诉你,你不能使用它,但你至少应该考虑不使用它作为一个可能的选择。 正如你所说,你在做什么,正在更新大量不同的UI元素。 你是不是执行单个UI任务,您正在执行的任务很多(几十,几百,几千,等等)。 您还可以负责管理所有的这些小任务一个单独的任务。 较小的任务这种管理既可以在UI线程或者非UI线程来完成。 如果你在UI线程做它,然后,直到每一个子UI动作完成的UI被阻塞。 如果您有只是作为“调度”非UI线程,加入了一些小的UI任务来完成,然后这些小UI任务可以独立进行,并允许UI做...什么...其间的一些这些任务。

这里有这样一个例子:

private void button1_Click(object sender, EventArgs e)
{
    Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < 10; i++)
        {
            Invoke(new MethodInvoker(() => updateLabel(i)));
            Invoke(new MethodInvoker(() => longerUITask(i)));
        }
    });
}

private void longerUITask(int i)
{
    //do databinding that will take a second or two
    Thread.Sleep(1000);
}

private void updateLabel(int i)
{
    label1.Text = i.ToString();
}

请问这样做效率较低。 是的,这将是。 你会被关闭产卵其他线程/任务,管理他们,等等。然而,你会得到什么为代价的简单而有效的保证用户界面将保持响应。



文章来源: DoEvents() hanging