private static void ПриНеобработанномИсключенииПотока(object sender, System.Threading.ThreadExceptionEventArgs t) { if (!Барс.Клиент.Приложение.ежимWebПриложения) { ФормаПоказаИсключительнойСитуации.Показать("При выполнении прикладной подсистемы произошла необработанная исключительная ситуация.", t.Exception); } }
public static void Показать(string ТекстСообщения, string Заголовок, Exception Исключение) { try { ФормаПоказаИсключительнойСитуации форма = new ФормаПоказаИсключительнойСитуации(); форма.Сообщение = ТекстСообщения; форма.Заголовок = Заголовок; форма.Исключение = Исключение; форма.ShowDialog(); } catch (Exception) { } }
public static void Показать(string ТекстСообщения, Exception Исключение) { ФормаПоказаИсключительнойСитуации.Показать(ТекстСообщения, "", Исключение); }
/// <summary> /// Метод инициализации нового треда /// </summary> /// <param name="ПараметрТреда"></param> private static void СтартоватьТред(object ПараметрТреда) { // мы уже находимся в новом треде System.Windows.Forms.Form ГлавнаяФормаПотока = null; try { // берем домен текущего приложения AppDomain доменПриложения = System.Threading.Thread.GetDomain(); // назначаем перехватчик необработанных исключений потока Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ПотокиПриложения.ПриНеобработанномИсключенииПотока); if (ПараметрТреда is System.Windows.Forms.Form) { ГлавнаяФормаПотока = ПараметрТреда as System.Windows.Forms.Form; } else if (ПараметрТреда is Type) { Type типСтартовогоОбъекта = ПараметрТреда as Type; if (типСтартовогоОбъекта == typeof(System.Windows.Forms.Form) || типСтартовогоОбъекта.IsSubclassOf(typeof(System.Windows.Forms.Form))) { ГлавнаяФормаПотока = Activator.CreateInstance(типСтартовогоОбъекта) as System.Windows.Forms.Form; } else if (типСтартовогоОбъекта.GetInterface("ИнтерфейсТочкиВходаПотока") != null) { object объектТочкиВходаПотока = Activator.CreateInstance(типСтартовогоОбъекта); if (объектТочкиВходаПотока != null) { ГлавнаяФормаПотока = типСтартовогоОбъекта.InvokeMember("ТочкаВходаПотока", BindingFlags.InvokeMethod, null, объектТочкиВходаПотока, new object [] { }) as System.Windows.Forms.Form; } } } else if (ПараметрТреда.GetType().GetInterface("ИнтерфейсТочкиВходаПотока") != null) { ГлавнаяФормаПотока = ПараметрТреда.GetType().InvokeMember("ТочкаВходаПотока", BindingFlags.InvokeMethod, null, ПараметрТреда, new object [] { }) as System.Windows.Forms.Form; } if (ГлавнаяФормаПотока == null) { throw new ИсключениеБарсПриложения("Не удалось получить главную форму нового потока приложения."); } bool результатУстановкиПараметровОкна = false; try { результатУстановкиПараметровОкна = ( bool )ГлавнаяФормаПотока.GetType().InvokeMember("УстановитьПараметрыОкна", BindingFlags.InvokeMethod, null, ГлавнаяФормаПотока, new string [] { "" }); } catch (Exception) { результатУстановкиПараметровОкна = true; } if (результатУстановкиПараметровОкна) { // регистрируем окно в нашем реестре НастольноеПриложение.ДобавитьТред(ГлавнаяФормаПотока, ""); ApplicationContext контексТреда = new ApplicationContext(ГлавнаяФормаПотока); Application.Run(контексТреда); Type тип = Type.GetType("Барс.Ядро.МенеджерБД,Ядро"); if (тип != null) { тип.InvokeMember("ОсвободитьРесурсыТреда", BindingFlags.InvokeMethod, null, null, null); } } } catch (Exception exc) { ФормаПоказаИсключительнойСитуации.Показать(exc.Message, exc); } finally { if (ГлавнаяФормаПотока != null) { НастольноеПриложение.ИсключитьТред(); } } }