истина, если поток контролирует или ранее контролировал форму - PullRequest
0 голосов
/ 25 января 2020

Я программирую 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, даже если вызывающий поток не является потоком пользовательского интерфейса. поэтому мне нужна функция, которая возвращает истину, если: текущий поток контролирует или ранее контролировал форму. есть что-то, что может сделать это?

и я не могу изменить имя потока пользовательского интерфейса, потому что я не хочу портить поток, который я не создал.

не стесняйтесь задавать вопросы об этом сложном объяснении моей ситуации.

Спасибо.

1 Ответ

1 голос
/ 26 января 2020

я не знаю, как изменить имя потока пользовательского интерфейса, потому что я не хочу связываться с тем, который я не создал

Я бы сказал, что даже если только неявно, вы создали основной (и любой другой) поток пользовательского интерфейса. Ваша программа и код является владельцем этого потока. Я не вижу смысла в go, чтобы не дать ему имя.

При этом свойство Thread.ManagedThreadId инвариантно для данного потока. Вместо того, чтобы называть какие-либо потоки, почему бы просто не поддерживать свой собственный словарь, сопоставляющий идентификатор потока с именем, с единственной целью ведения журнала? Тогда каждый поток может точно указать свое имя именно для этой цели, не вмешиваясь ни в какую другую причину, по которой код может захотеть назвать поток, и он будет работать для всех потоков, которым вы хотите дать имя, независимо от того, Создал их или нет.

Если хотите, такой подход может даже позволить изменить имя потока с целью изменения логов, в зависимости от того, что этот поток на самом деле делает в данный момент, что невозможно при использовании Thread.Name свойство. Например, может быть, вы хотите, чтобы рабочие потоки из пула потоков имели имя, отражающее независимо от того, какой была точка входа current для этого рабочего, и устанавливали это имя каждый раз, когда рабочему потоку назначается новая задача. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...