У меня есть приложение, в которое встроена асинхронная операция, которая зацикливается на большом количестве элементов и выполняет длительные вычисления для каждого элемента, так как это происходит при определенных условиях, когда приложение вызывает всплывающее диалоговое окно для пользовательского ввода. Интересно, что я заметил, выполняя это сегодня, что в одном экземпляре приложения модальные диалоги каким-то образом получили неправильную родительскую форму - вместо того, чтобы предоставить модальный блок моему приложению, диалоги приняли окно чата 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);