C#后台工作人员循环问题

C#后台工作人员循环问题,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,好吧,这很令人沮丧。也许我只是在放屁。基本上,我让一个按钮做1/2的动作,这取决于标志的设置方式。当我第一次单击btTest时,它工作正常,并将按钮文本设置为重新测试。现在,如果我再次单击它,它会将其设置为Test,但随后会返回到开头并将其设置为ReTest。我不明白为什么它在循环。它应该是if或者else。如果不是(单击1),则如果是(单击2),则在单击“新建”时重复。它应该(在我看来),做如果(点击1),否则(点击2),重复新的点击。请帮助我理解这一点。我不知道,也许是因为嫁妆的作用。谢谢

好吧,这很令人沮丧。也许我只是在放屁。基本上,我让一个按钮做1/2的动作,这取决于标志的设置方式。当我第一次单击btTest时,它工作正常,并将按钮文本设置为重新测试。现在,如果我再次单击它,它会将其设置为Test,但随后会返回到开头并将其设置为ReTest。我不明白为什么它在循环。它应该是if或者else。如果不是(单击1),则如果是(单击2),则在单击“新建”时重复。它应该(在我看来),做如果(点击1),否则(点击2),重复新的点击。请帮助我理解这一点。我不知道,也许是因为嫁妆的作用。谢谢

基本上,每次单击按钮时,您都在使用相同的代码向worker添加另一个代理。当您调用
RunWorkerAsync()
时,它将执行第一个委托,您将得到“测试”结果,然后它将执行第二个委托(相同的代码),并将其设置回“重新测试”


您可以通过单击三次来证明这一点,您应该会看到“测试”->“重新测试”->“测试”。

您实际上每次单击都会附加一个代理,对吗?所以基本上,在第二次单击时,您会调用代理两次。噢,哇。。这很有道理。我甚至没想到。我对这种穿线的东西很陌生。但这一切都不同。谢谢
private void btnTest_Click(object sender, RoutedEventArgs e)
{
    try
    {
        worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {
            if (flag == false)
            {
                setBtnText(btTest, "ReTest"); 
                flag = true;
            }
            else
            {
                setBtnText(btTest, "Test");
                flag = false;
            }
        };

        worker.RunWorkerAsync();
    }
    catch (Exception ex)
    {
        ErrorLogger(ex, "");
    }
}