/// <summary> /// Запуск формы в другом потоке /// </summary> /// <param name="hFinishedSearchEvent"> /// Событие, установка которого закрывает окно /// </param> /// <param name="th"> /// Поток, в котором создаётся окно /// </param> /// <param name="WndTitle"></param> /// <param name="WndText"></param> public static int ShowAsync(out AutoResetEvent hFinishedSearchEvent, out Thread th, string WndTitle, string WndText, Window OwnerWindow) { hFinishedSearchEvent = new AutoResetEvent(false); th = new Thread(ShowAsyncThreadFunc) { IsBackground = true }; if (m_csShowCounter.Value > 0) { return(0); } m_csShowCounter++; CShowAsyncParam ThreadParam = new CShowAsyncParam() { m_ID = NextWndID, m_hFinishedSearchEvent = hFinishedSearchEvent, m_WndTitle = WndTitle, m_WndText = WndText, m_OwnerWindow = OwnerWindow }; th.SetApartmentState(ApartmentState.STA); th.Start(ThreadParam); GlobalDefines.DoEvents(DBManagerApp.MainWnd); // Чтобы не зависла главная форма и в её заголовке не было написано "(Не отвечает)" return(NextWndID++); }
/// <summary> /// Функция потока. /// Отдельная функция сделана для того, чтобы в неё можно было передать "out AutoResetEvent hFinishedSearchEvent" /// </summary> /// <param name="Parameter"></param> private static void ShowAsyncThreadFunc(object Parameter) { CShowAsyncParam ThreadParam = Parameter as CShowAsyncParam; CWaitingWnd wnd = new CWaitingWnd(ThreadParam.m_ID, ThreadParam.m_hFinishedSearchEvent, ThreadParam.m_OwnerWindow, ThreadParam.m_WndText, ThreadParam.m_WndTitle, 300); try { m_dictAllWnds.TryAddValue(ThreadParam.m_ID, wnd); wnd.ShowDialog(); } catch (Exception ex) { DumpMaker.HandleExceptionAndClose(ex, AppAttributes.Title); } }