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 коробок с картинками, одно из которых - анимированное изображение. Я не понимаю, почему иногда вылетает с этой ошибкой, а иногда нет.

Есть идеи по этим вопросам?

0 ответов

Другие вопросы по тегам