编辑几年:这显然是一种可怕的方法,在我开始使用C#/ .NET时。希望这个问题有助于另一个具有相同“问题”的菜鸟。
这是解决这种情况的最佳方式吗?
while(true)
{
if(Main.ActiveForm != null)
{
Main.ActiveForm.Invoke(new MethodInvoker(Main.SomeMethod));
break;
}
}
这是在第二个线程上执行的。
答案 0 :(得分:10)
您需要做的就是将事件处理程序附加到表单的Activated
事件。在该表单的构造函数中添加以下内容:
Activated += SomeMethod;
在以前使用其他应用程序之后重新激活表单时,它将被触发。
这种方法的主要优点是你可以避免创建一个新的线程,只是为了让它围绕着一个spinwait(使用大量的CPU周期)。
答案 1 :(得分:4)
当你使用循环时你是浪费CPU。 更好的方法是使用事件:
// make event object in some shared place
var ev = new ManualResetEvent(false);
// do when form loaded
ev.Set();
// wait in thread
ev.WaitOne();
答案 2 :(得分:2)
使用:
while(Main.ActiveForm == null) { }
答案 3 :(得分:2)
如果您想使用此方法,请注意您有竞争条件:其他人可能会在您的测试和Main.ActiveForm
电话之间将Invoke()
设置为空。这会导致异常。
在进行任何测试之前在本地复制变量,以确保变量不能为空。
while(true)
{
var form = Main.ActiveForm;
if(form != null)
{
form.Invoke(new MethodInvoker(Main.SomeMethod));
break;
}
}
答案 4 :(得分:1)
我会那样做。
while(Main.ActiveForm == null)
{
//maybe a sleep here ?!
}
Main.ActiveForm.Invoke(new MethodInvoker(Main.SomeMethod));