C # BackgroundWorker зацикливание проблем - PullRequest
2 голосов
/ 10 марта 2011
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, "");
    }
}  

Хорошо, это довольно сложно.Может быть, у меня просто мозг пердит.По сути, я заставляю одну кнопку выполнять 1/2 действия в зависимости от того, как установлен флаг.Когда я нажимаю btTest в первый раз, он работает правильно и устанавливает для текста кнопки значение Retest.Теперь, если я щелкну по нему еще раз, он установит для него «Тест», но затем вернется к началу и вернет к «Повторному тестированию».Я не понимаю, почему это возвращается назад.Следует либо сделать, либо, либо иначе.Не если (нажмите 1), а затем, если (нажмите 2), повторите при новом щелчке.Следует (по моему мнению), если (нажмите 1), в противном случае (нажмите 2), повторите при новом щелчке.Пожалуйста, помогите мне понять это.Может быть, это то, как DoWork делает вещи, я не знаю.Спасибо!

1 Ответ

2 голосов
/ 10 марта 2011

По сути, каждый раз, когда вы нажимаете кнопку, вы добавляете другого делегата к работнику с тем же кодом. Когда вы вызываете RunWorkerAsync(), он выполнит первый делегат, и вы получите результат «Тест», затем он выполнит второго делегата (тот же код) и вернет его к «ReTest».

Вы можете доказать это себе, щелкнув по нему 3 раза, вы должны увидеть «Test» -> «ReTest» -> «Test».

...