Приложение формы C # - модальные диалоги имеют неверного родителя - PullRequest
0 голосов
/ 26 марта 2009

У меня есть приложение, в которое встроена асинхронная операция, которая зацикливается на большом количестве элементов и выполняет длительные вычисления для каждого элемента, так как это происходит при определенных условиях, когда приложение вызывает всплывающее диалоговое окно для пользовательского ввода. Интересно, что я заметил, выполняя это сегодня, что в одном экземпляре приложения модальные диалоги каким-то образом получили неправильную родительскую форму - вместо того, чтобы предоставить модальный блок моему приложению, диалоги приняли окно чата Digsby в качестве своего родителя.

Окно Digsby, которое они стали дочерними, всплывало примерно в то же время, когда был создан первый диалог (возможно, в то же самое время), и казалось бы, что они каким-то образом пересекались, потому что окно Digsby стало полностью заблокированным до Асинхронная операция завершена. Я не знаю, как это возможно, учитывая, как работает многопоточность, но это, безусловно, произошло. Что может вызвать такую ​​ошибку? Кстати, это C # .NET 3.5 с Windows Forms, работающими в Windows XP.

Вот асинхронный код в двух словах:

Action<List<ClubListing>> a = delegate(List<ClubListing> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
                var cl = list[i];
                if (cl.MatchingClubListing == null)
                {
                    var compare = CompareNames(cl.Club.Name);
                    if (compare.Any(c => c.Value == 0 && c.Key.Club.State == cl.Club.State))
                    {
                        var match = compare.First(c => c.Value == 0 && c.Key.Club.State == cl.Club.State);
                        compareDialog.ClubA = cl.Club;
                        compareDialog.ClubB = match.Key.Club;
                        DialogResult dr = compareDialog.ShowDialog();
                        if (dr == DialogResult.Yes)
                        {
                            cl.MatchingClubListing = match.Key;
                            match.Key.MatchingClubListing = cl;
                        }
                        else if (dr == DialogResult.Abort)
                        {
                            break;
                        }
                    }
                }
                this.Invoke(new MethodInvoker(delegate()
                {
                    this.prbOperationProgress.Value = i;
                }));
            }
        };

        AsyncCallback callback = new AsyncCallback(SaveAndUpdate);
        var result = a.BeginInvoke(this.lbxLiveClubs.Items.Cast<ClubListing>().ToList(), callback, null);

Ответы [ 3 ]

3 голосов
/ 26 марта 2009

Добавьте родительский диалог в качестве аргумента для сравненияDialog.ShowDialog (). Например:

Form parent = ...;
compareDialog.ShowDialog(parent);
0 голосов
/ 26 марта 2009

Похоже, вы показываете свой диалог сравнения в рабочем потоке. Я думаю, что вы можете быть в порядке, если вы используете вызов Invoke, чтобы показать свой диалог.

0 голосов
/ 26 марта 2009

Так же, как вы вызываете обновление ProgressBar, вам нужно Invoke() показ вашего диалога.

...