使用Invoke执行方法时遇到问题

时间:2012-08-20 20:35:19

标签: c# invoke

我有一个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!!!
    }

1 个答案:

答案 0 :(得分:3)

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

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

您的对象的构造永远不会完成,并且您可能阻止了GUI线程,这将阻止处理任何消息,包括Invoke

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

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

<强>建议

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