C# 如果线程控制或以前控制窗体,则为true

C# 如果线程控制或以前控制窗体,则为true,c#,multithreading,winforms,C#,Multithreading,Winforms,我正在编写一个C#WinForm,它将在一个不是我的框架中运行 我正在使用一个自定义VS项目来输出库文件(.dll) 在这个自定义项目中,有一个函数在自定义类和另一个表单类中充当“main”函数。 “main”函数的最后一行始终是form.closevet.waitone(),因此,当窗体关闭时,运行“main”函数的线程应该结束其执行 我将库文件复制到主程序库文件夹,并使用主程序(同样,我没有编程),从创建的库文件创建一个新表单 在后台,主程序(称为“管理器”)在线程中创建窗体(我不知道这是否

我正在编写一个C#WinForm,它将在一个不是我的框架中运行

我正在使用一个自定义VS项目来输出库文件(.dll)

在这个自定义项目中,有一个函数在自定义类和另一个表单类中充当“main”函数。 “main”函数的最后一行始终是form.closevet.waitone(),因此,当窗体关闭时,运行“main”函数的线程应该结束其执行

我将库文件复制到主程序库文件夹,并使用主程序(同样,我没有编程),从创建的库文件创建一个新表单

在后台,主程序(称为“管理器”)在线程中创建窗体(我不知道这是否是“管理器”主线程,但“管理器”创建的所有窗体都是使用同一线程创建的),并创建一个新线程,开始在我创建的库中运行“main”函数

这是我的问题: 因为这是一个多线程环境,所以每次调用log writeline函数时,我都希望向日志文件中添加线程名称或编号。 如果线程有名称,则应写入名称;否则,应写入线程id。 控制“管理器”打开的所有表单的线程没有名称,但每次该线程试图在日志中写入数据时,我仍然希望在日志UI线程中写入

此日志功能(和日志文件)仅适用于“经理”打开的一个表单,每个表单都有自己的日志 日志文件和写函数

我目前的做法是:

        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();
问题是,在处理表单之后(对于关闭日志文件之前的最终日志数据),可能会调用write to log函数。 如果发生这种情况,即使调用线程不是UI线程,newForm.invokererequired也会返回false。 因此,我需要一个返回true的函数,如果:当前线程正在控制或以前控制表单。 有什么东西可以做到这一点

我不知道如何更改UI线程名称,因为我不想弄乱一个我没有创建的线程

请随时就我的情况的这一复杂解释提出问题

多谢各位

我不知道如何更改UI线程名称,因为我不想弄乱我没有创建的线程

我认为,即使只是隐式地创建了主(和任何其他)UI线程。您的程序和代码是该线程的所有者。我看没有理由不给它起个名字

也就是说,该属性对于给定线程是不变的。与其命名任何线程,为什么不维护自己的字典,将线程ID映射到名称,只用于日志记录?然后,每个线程都可以为此目的精确地指定它的名称,而不影响代码可能希望命名线程的任何其他原因,并且它将适用于您想要命名的所有线程,无论您是否创建了它们

如果您愿意,这种方法甚至可以允许记录日志的线程名称发生更改,这取决于该线程当前实际执行的操作,这在使用该属性时是不可能的。例如,您可能希望线程池中的工作线程具有反映该工作线程当前入口点的名称,并在每次为工作线程分配新任务时设置该名称