C#: форма WinForm висит при нажатии кнопки, а иногда и при загрузке формы
Я изменяю устаревшее решение Visual Studio .NET 2003 и.NET 1.1 на C#.
Я только что создал новую форму. Эта форма имеет четыре коробки с картинками. Три из них содержат изображение PNG, а последний - анимированное изображение. Также есть ярлык. Наконец, у меня есть кнопка, которая отображается в зависимости от некоторого условия (результат int).
Класс формы как ниже:
private System.Threading.Timer _timer;
public delegate int GetPriceDelegate(Person person, out string resultMsg);
int GetPrice(Person person, out string resultMsg);
private void FrmPrices_Load(object sender, System.EventArgs e)
{
AsyncCallback callback = new AsyncCallback(PriceCallback);
GetPriceDelegate handler = new GetPriceDelegate(Commons.GetPrice);
handler.BeginInvoke(person, out resultMsg, callback, null);
}
private void PriceCallback(IAsyncResult result)
{
GetPriceDelegate handler = (GetPriceDelegate) ((AsyncResult) result).AsyncDelegate;
try
{
string resultMsg;
int rs = handler.EndInvoke(out resultMsg, result);
if (rs == 0)
{
this.pictureBox.SendToBack();
this.pictureBox.Visible = false;
this.btnOk.BringToFront();
this.btnOk.Visible = true;
System.Threading.TimerCallback callback = new System.Threading.TimerCallback(Timer_Callback);
_timer = new System.Threading.Timer(callback, null, 10000, System.Threading.Timeout.Infinite);
}
else if (rs == -1)
{
}
else
{
}
}
catch (Exception ex)
{
// do something
}
}
private void Timer_Callback(object state)
{
this.Close();
}
private void btnOk_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void FrmPrices_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (_timer != null)
{
_timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
_timer.Dispose();
}
}
В другом классе, Commons, есть метод GetPrice. Этот метод в основном вызывает веб-сервис и возвращает результат.
Когда выполняется обратный вызов "PriceCallback" для асинхронного вызова (асинхронный вызов метода завершается), я вызываю EndInvoke(...) и проверяю результат, возвращаемый асинхронным вызовом.
Если результат равен 0 (rs == 0), то я отправляю назад и делаю невидимым изображение-коробку, выводу вперед и делаю видимой кнопку. Примечание: в форме кнопка расположена над картинкой, но одновременно отображается только одна из них (картинка или кнопка). Наконец, я создаю таймер и запускаю его.
Таким образом, в этот момент форма отображается с меткой (содержащей сообщение) и кнопкой (чтобы закрыть форму). Это сообщение отображается в течение 10 секунд. Если пользователь не нажимает кнопку, чтобы закрыть форму, то форма закрывается автоматически по истечении 10 секунд, заданных для таймера.
Моя проблема заключается в следующем:
- Когда форма показывается с надписью и кнопкой (чтобы закрыть форму), я не могу нажать на кнопку, кажется зависшей, так как она игнорирует щелчок. Кроме того, если я пытаюсь нажать кнопку, то SO говорит, что популярное приложение не отвечает. Если при показе формы я не нажимаю на кнопку и жду, пока не пройдут 10 секунд, то форма автоматически закроется правильно. Так почему же кнопка игнорирует мой клик по ней? Насколько я знаю, таймер не блокирует основной поток пользовательского интерфейса, верно? так почему нажатие кнопки не отвечает?
- Когда форма загружается путем вызова ShowDialog(), иногда (не всегда) я получаю сообщение об ошибке ниже: "Не удалось загрузить ресурсы из файла ресурсов. Пожалуйста, проверьте ваши настройки".
Единственные ресурсы, которые у меня есть, - это четыре изображения для 4 коробок с картинками, одно из которых - анимированное изображение. Я не понимаю, почему иногда вылетает с этой ошибкой, а иногда нет.
Есть идеи по этим вопросам?