Я программирую C# WinForm, который будет работать в среде, которая не принадлежит мне.
Я использую пользовательский проект VS, который выводит файл библиотеки (.dll).
В этом пользовательском проекте есть функция, которая действует как «основная» функция в пользовательском классе и другом классе формы. Последняя строка в функции main всегда form.Closeevet.waitone (); , поэтому, когда форма закрывает поток, запуск функции «main» должен завершить его выполнение.
Я копирую файл библиотеки в папку библиотеки основной программы и использую основную программу (что опять же, я не t), я создаю новую форму из созданного мной файла библиотеки.
Под капотом основная программа (называемая «менеджером») создает форму в потоке (я не знаю, является ли это основной поток "manager", но все формы, созданные "менеджером", создаются с использованием одного и того же потока), и создается новый поток, который запускает функцию "main" в моей созданной библиотеке.
это Моя проблема: поскольку это многопоточная среда, каждый раз, когда вызывается моя функция записи журнала, я хочу добавить в файл журнала имя или номер потока. если у потока есть имя, имя должно быть написано иначе, идентификатор потока должен быть записан. поток, управляющий всеми формами, открытыми «менеджером», не имеет имени, но я все еще хочу записывать в поток пользовательского интерфейса журнала каждый раз, когда этот поток пытается записать данные в журнал.
this log function ( и файл журнала) только для одной формы, открытой «менеджером», каждая форма имеет свой собственный файл журнала и функции записи.
мой текущий подход заключается в следующем:
if (newForm!= null && !newForm.InvokeRequired) threadName = "UI";
else if (Thread.CurrentThread.Name != null && Thread.CurrentThread.Name != "")
threadName = Thread.CurrentThread.Name;
else threadName = Thread.CurrentThread.ManagedThreadId.ToString();
проблема то есть, функция записи в журнал может быть вызвана после удаления формы (для окончательных данных журнала перед закрытием файла журнала). Если это происходит, newForm.InvokeRequired возвращает false, даже если вызывающий поток не является потоком пользовательского интерфейса. поэтому мне нужна функция, которая возвращает истину, если: текущий поток контролирует или ранее контролировал форму. есть что-то, что может сделать это?
и я не могу изменить имя потока пользовательского интерфейса, потому что я не хочу портить поток, который я не создал.
не стесняйтесь задавать вопросы об этом сложном объяснении моей ситуации.
Спасибо.