Не думал, что мой вопрос вызовет такое бурное обсуждение. Но всё же, не понимаю почему некоторые считают, что использование диалоговых окон в потоках, это признак неверного проектирования. Могу просто кратко обрисовать задачу:
Есть некоторое приложение у которого есть функция автоматического update-а (скачивание новой версии). Когда приложение запускается, оно проверяет наличие новой версии в нэте и если таковое обнаруживается, то появляется MessageBox с вопросом: "Не хотите ли обновить". Так вот эту проверку с диалогом я хочу запустить в отдельном потоке, т.к. не всегда эта проверка проходит быстро, а я не хочу чтобы она тормозила работу приложения
Буду рад если кто-нить подскажет иной путь решения этой проблемы. Насчёт Invoke, я его и юзаю, но вы просто наверно не представляете проблемы
public static void CheckForUpdate(bool ShowMessage) {
...
// Вот тут мне нужно получить ссылку на главную форму, но т.к. этот метод запушен в другом потоке....
// Может я зря это делаю, но пока не нашёл другого решения
if (MessageBox.Show(!!!Pointer HERE!!!, "New version of " + System.Windows.Forms.Application.ProductName + " is available" +
"\r\n Do you want to download and update it?",
"New version is available",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes) {
...
}
}
// вот что-то типа такого я делаю ---------------------------------------
private void FormMain_Load(object sender, EventArgs e) {
m_CheckForUpdateThread = new Thread(new ThreadStart(CheckForUpdate));
m_CheckForUpdateThread.Start();
}
public void GetFormMainPtr(ref FormMain FormMainPtr) {
if (this.InvokeRequired) {
GetFormMainPtrCallback callback = new GetFormMainPtrCallback(GetFormMainPtr);
this.Invoke(callback, new object[] {FormMainPtr});
}
else {
FormMainPtr = this;
}
}
//Но это естественно не работает -----------------------------------------
Автору предыдущего ответа
Я конешно понимаю вас но хочу сказать, что иногда лучше самому в чём-то покапаться, чём требовать сразу готовенькое. Так ничему не научишся.