Имеется две формы Form1 и Form2
Имеется функция в Form1:
public void setLog(string txt) { if (this.richTextBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(setLog); this.Invoke(d, new object[] { txt + "\n" }); } else { this.richTextBox1.Text = this.richTextBox1.Text + txt + "\n"; this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length; this.richTextBox1.ScrollToCaret(); try { string path = Directory.GetCurrentDirectory() + "\\udp.log"; // Get the current directory. DateTime current = DateTime.Now; System.IO.StreamWriter file = new System.IO.StreamWriter(path, true); file.WriteLine(current + ": " + txt + "\n"); file.Close(); } catch (Exception e) { MessageBox.Show("Произошла непредвиденная ошибка.\n" + e, "Ошибка"); } } }
Так же имеется отдельный тред для подключения и выполнения запроса в Form1:
public Form1() { InitializeComponent(); setLog("Reading sql config."); Thread MyThread = new Thread(new ThreadStart (loadSQL)); MyThread.Start(); } ... private void loadSQL() { MySqlConnection connection = new MySqlConnection(connectionString); ... setLog("Done. Loaded " + count + " servers."); }
Суть: если не использовать мультипоточность, проблем с setLog не возникает при вызове Form2.
А если используется и вызвать Form2, то вываливается ошибка: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
this.Invoke(d, new object[] { txt + "\n" }); // вот на этой линии в функции setLog
Вопрос: как заставить все правильно работать и избежать этого эксцепшена?