2

我有一个使用 Flash 控件播放电影的 C# 程序。我遇到的问题是,当我在电影完全加载之前尝试向 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!!!
    }
4

1 回答 1

3

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

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

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

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

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

建议

Create two forms. Put the Flash control in its own form and show that form first. When that form is closed, you can then open the second form to show the rest of your application.

于 2012-08-20T20:38:15.120 回答