C# 使用Invoke执行方法时出现问题

C# 使用Invoke执行方法时出现问题,c#,invoke,C#,Invoke,我有一个C#程序,它使用Flash控件播放电影。我遇到的问题是,当我试图在电影完全加载之前向Actionscript发送消息时,我收到一个错误。为了解决这个问题,我设置了一个计时器,在继续之前等待1秒。这反过来又产生了一个不同的问题,因为我现在运行的是另一个线程。为了解决这个问题,我尝试在计时器事件处理程序中使用Invoke,但由于某种原因,它似乎没有实际调用该方法。我可以看到进程正在使用50%的cpu,但它从未从Invoke语句返回。我已经研究了许多问题,并且尝试了4到5种不同的方法来使用In

我有一个C#程序,它使用Flash控件播放电影。我遇到的问题是,当我试图在电影完全加载之前向Actionscript发送消息时,我收到一个错误。为了解决这个问题,我设置了一个计时器,在继续之前等待1秒。这反过来又产生了一个不同的问题,因为我现在运行的是另一个线程。为了解决这个问题,我尝试在计时器事件处理程序中使用Invoke,但由于某种原因,它似乎没有实际调用该方法。我可以看到进程正在使用50%的cpu,但它从未从Invoke语句返回。我已经研究了许多问题,并且尝试了4到5种不同的方法来使用Invoke和BegainInvoke方法。我的应用程序的设计是,我有一个实例化表单的主类。表单的构造函数加载并开始播放电影。主类设置计时器,并尝试显示窗体,这就是问题发生的地方

    public MyClass()
    {
        demoForm = new DemoForm();

        timer.Elapsed += new ElapsedEventHandler(engine);

        timer.Interval = 1000;
        timer.Enabled = true;

        for (int i = 0; ; i++)
            counter++;
    }

    private void engine(Object source, ElapsedEventArgs e)
    {

        timer.Enabled = false;

        if (demoForm.InvokeRequired)
        {
            demoForm.BeginInvoke(new MethodInvoker(sendNextMessage));
        }
        else
        {
            sendNextMessage();
        }

    }

    private void sendNextMessage()
    {
        // It never gets here!!!
    }

这是一个无限繁忙的循环:

  for (int i = 0; ; i++)
        counter++;
对象的构造永远不会完成,您可能正在阻止GUI线程,这将阻止处理任何消息,包括
调用

您可能会看到50%的CPU使用率,因为您有一个双核处理器。其中一个核心位于繁忙的循环中,重复递增计数器。另一个核心是空闲的

您说您使用循环来阻止应用程序终止,但这不是正确的方法。您应该调用
应用程序。从main方法运行
。当您创建新的Windows窗体项目时,Visual Studio会自动为您添加此代码

建议


创建两个表单。将Flash控件放在它自己的窗体中,并首先显示该窗体。关闭该表单后,您可以打开第二个表单以显示应用程序的其余部分。

我认为您应该使用
demoForm.Invoke(newmethodinvoker(sendNextMessage))而不是
demoForm.BeginInvoke(新方法调用程序(sendNextMessage))。感谢您的回复。我尝试过使用BeginInvoke和Invoke,但结果相同。是的,我自己刚刚测试过。也许DemoForm的构造函数中有什么东西阻止了它的创建?因此,当计时器启动时,它的构造函数仍在运行。不,当计时器结束时,它将执行事件处理程序,这是引擎方法。在语句demoForm.BeginInvoke(newmethodinvoker(sendNextMessage))出现之前,这一切都有效;之后就再也不会回来了。虽然这肯定是一个无限循环,但问题的性质完全不同。计时器正在另一个线程上运行,因此我无法将此视为问题的答案。@NikolaMalešević:计时器将事件发送到消息队列。但是无限循环将阻止任何消息被处理。当我将语句counter++更改为Applications.DoEvents()时,它起了作用。谢谢您的回复。@MarkByers没有,刚刚测试过这个,计时器就会启动,
sendNextMessage()
每秒都会被调用。