直到var不为null

时间:2013-01-21 15:24:16

标签: c# .net while-loop

编辑几年:这显然是一种可怕的方法,在我开始使用C#/ .NET时。希望这个问题有助于另一个具有相同“问题”的菜鸟。

这是解决这种情况的最佳方式吗?

while(true)
{
    if(Main.ActiveForm != null)
    {
        Main.ActiveForm.Invoke(new MethodInvoker(Main.SomeMethod));
        break;
    }
}

这是在第二个线程上执行的。

5 个答案:

答案 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));