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