首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BeginInvoke未被执行

BeginInvoke未被执行
EN

Stack Overflow用户
提问于 2017-01-12 16:00:56
回答 2查看 844关注 0票数 0

我在Windows窗体上有下一个代码

代码语言:javascript
复制
if (control.IsHandleCreated)
{
    if (control.InvokeRequired)
    {
        control.BeginInvoke(action);
    }
    else
    {
        action.Invoke();
    }
 }

通过调试,它进入了InvokeRequired = false,并且工作得很好,但是在生产环境中。它以某种方式进入InvokeRequired = true,因此它应该执行BeginInvoke()方法。

它没有。它从来没有进入行动。这个脚本属于DataGrid控件,但是在不同的DataGrids、Comboboxes等相同的表单上具有相同的功能;因此,对于这个DataGrid来说,它似乎是一种额外的东西。有什么想法吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-04-14 05:41:59

我试图找到真正的答案,我的猜测是,当您调用thread调用时,消息会被放在队列中等待该线程。该线程从这个队列中取出项目,并将它们一一对应地处理。您的队列将变得越来越大,并需要越来越多的时间来处理。然后,主线程可能会被阻塞,做其他事情。当您的线程正在执行这些其他事情时,它将不会处理队列中的项,那么线程就无法访问该控件。我测试了您的代码,在缺少访问权限的情况下,代码不能重复,然后我更改了代码,并在重复一两次之后工作:

代码语言:javascript
复制
int i = 0;
    public delegate void AsyncMethodCaller();
    private  void proc2()
    {
        Action action = () => control1.Text = (i += 1).ToString();

        if (control1.IsHandleCreated)
        {
            if (control1.InvokeRequired)
            {
                control1.BeginInvoke(new AsyncMethodCaller(proc2));
            }
            else
            {
                action.Invoke();
            }
        }
        else
        {
            MessageBox.Show("Handle creation error");
        }
    }

    private void proc1()
    {
        for (int i=0; i<1000; i++)
        {
            //do something
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Thread thread1 = new Thread(proc1);
        thread1.Start();

        Thread thread2 = new Thread(proc2);
        thread2.Start();
    }
票数 1
EN

Stack Overflow用户

发布于 2019-04-11 06:10:09

这就是我刚才说的:

代码语言:javascript
复制
<your control>.Invoke(new MethodInvoker(delegate () {
   … do your work here
}));

-Gina

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41617725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档