2013-06-28 2 views
1

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

код:

public partial class MainForm : Form 
{ 
    ControlPanelForm m_controlPanel = new ControlPanelForm(); 
    // .... 
    void MeterThread() 
    { 
     while (true) 
     { 
      // .... 
      if (EMOdetected) 
      { 
       m_controlPanel.Deinitialize();      
       m_controlPanel.Hide();   // **** // 
      } 
     } 
    } 
} 

В принципе, мой MainForm подтягивает форму панели управления, что делает некоторую работу. В фоновом режиме у меня есть поток и проверка на предмет, один из которых - аварийное выключение, после чего я хочу закрыть панель управления и скрыть ее.

Если я пытаюсь вызвать его прямо там,

m_controlPanel.Invoke(new EMOHandler(m_controlPanel.Hide)); // **** // 

это не выглядит, как он выполняет что-нибудь, когда я его отладки. Похоже, что он просто передает команду. Опять же, я новичок в этом, поэтому любые объяснения приветствуются.

ответ

4

Там нет причин, чтобы проверить InvokeRequired или создать анонимный метод. Просто напишите

mainForm.Invoke(new MethodInvoker(mainForm.Hide)); 
+0

Вы правы насчет InvokeRequired. –

2

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

if (mainForm.InvokeRequired) 
{ 
    mainForm.Invoke(new Action(() => 
    { 
     mainForm.Hide(); 
    })); 
} 
else  
    mainForm.Hide(); 
0

В качестве простого правила, которое вы уже указывали: Вы не должны получить доступ к одному окну из другого потока.

Я хотел бы предложить вам что-то вроде этого:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     new Thread(SampleFunction).Start(); 
    } 

    public void AppendTextBox(string value) 
    { 
     if (InvokeRequired) 
     { 
      this.Invoke(new Action<string>(AppendTextBox), new object[] {value}); 
      return; 
     } 
     textBox1.Text += value; 
    } 

    void SampleFunction() 
    { 
     // Gets executed on a seperate thread and 
     // doesn't block the UI while sleeping 
     for(int i = 0; i<5; i++) 
     { 
      AppendTextBox("hi. "); 
      Thead.Sleep(1000); 
     } 
    } 
} 

Это очень хороший пример того, как использовать Многопоточность, которую я получил от here.

Хотя в вашем случае, метод Hide уже существует на MainForm и буквально ждет вас, чтобы быть вызван, как и другие уже указывали:

mainForm.Invoke(new MethodInvoker(mainForm.Hide));