Я не могу понять, как это возможно. Пожалуйста, помогите !!
У меня есть приложение с трайконом. Я хочу, чтобы форма отображалась, когда пользователь дважды щелкает на панели задач. У меня проблема с тем, что можно получить 2 или более форм, отображая быстрый тройной или четырехкратный щелчок по трейкону. Причина, по которой я не хочу синглтона, заключается в том, что я хочу, чтобы форма выпускалась каждый раз, когда она закрыта, чтобы сохранить память, может быть, это не очень хорошая идея?
У меня есть поле с именем m_form1.
У меня есть метод с именем ShowForm1;
Я вызываю метод ShowForm1 по двойному щелчку TrayIcon.
private Form1 m_form1;
private void ShowForm1()
{
if (m_form1 == null)
{
Trace.WriteLine("*CREATE*" + Thread.CurrentThread.ManagedThreadId.ToString());
m_form1 = new Form1();
m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
m_form1.Show();
}
m_form1.BringToFront();
m_form1.Activate();
}
Таким образом, когда Form1 требуется некоторое время для создания, тогда можно создать 2, потому что m_form1 все еще равен нулю, когда поступает второй вызов. Блокировка, похоже, не работает, так как это один и тот же поток при обоих вызовах (я предполагаю, что поток пользовательского интерфейса), то есть трассировка дважды записывает * CREATE * 1 (ниже).
[3560] *CREATE*1
[3560] *CREATE*1
Изменение кода для включения оператора блокировки мне не помогает.
private Form1 m_form1;
private object m_Locker = new object();
private void ShowForm1()
{
lock (m_Locker)
{
if (m_form1 == null)
{
Trace.WriteLine("****CREATE****" + Thread.CurrentThread.ManagedThreadId.ToString());
m_form1 = new Form1();
m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
m_form1.Show();
}
}
m_form1.BringToFront();
m_form1.Activate();
}
Как мне справиться с этой ситуацией?
Спасибо, ребята
Тим.