C# 侦听事件的线程

C# 侦听事件的线程,c#,multithreading,events,C#,Multithreading,Events,我正在编写一个程序,其中我有“n”个线程,每个线程名为“0”、“1”、“2”、“3”…”n-1′。每个线程都在侦听主线程上的按钮单击事件。单击按钮时,每个线程必须将文本框中的文本与其名称进行比较。如果文本相同,线程必须显示它,否则,它必须显示“notthis” 但当我创建多个线程,甚至在文本框中输入“0”时,所有线程都显示“不是这个” 当我尝试调试时,在“if(x==Thread.CurrentThread.Name)”行中,所有线程的Thread.CurrentThread.Name的值都为N

我正在编写一个程序,其中我有“n”个线程,每个线程名为“0”、“1”、“2”、“3”…”n-1′。每个线程都在侦听主线程上的按钮单击事件。单击按钮时,每个线程必须将文本框中的文本与其名称进行比较。如果文本相同,线程必须显示它,否则,它必须显示“notthis”

但当我创建多个线程,甚至在文本框中输入“0”时,所有线程都显示“不是这个”


当我尝试调试时,在“if(x==Thread.CurrentThread.Name)”行中,所有线程的Thread.CurrentThread.Name的值都为NULL。请给我一个解决方案。

这不是线程的工作原理。 您需要逐步检查代码以查看发生了什么。在一天结束时,它做它所做的,因为它就是这样工作的

基本上,事件是在ui线程上引发的,因此其余的执行在该线程上进行。您需要在要处理事件的线程中引发事件,这意味着将控制权传递给事件处理程序中的其他线程

如果你真的设法让它工作,但是你会写魔鬼代码本身。您正在编写的内容可能会产生巨大的副作用,因为您将有多个线程写入ui线程在用于ui时可能将其视为其状态的内容

您正在尝试在线程上启动ui,而不是启动ui。那是一个诺诺

您希望使用异步工作模式

这是新学校的做法

您还应该阅读线程和windows窗体。我不太会在ui上执行线程,但当我执行时,我总是要回去检查它是如何工作的


另一方面,如果您正在创建这样的线程,那么您就做错了;)有一种更好的方法可以做到这一点,它不依赖于您正确地获取所有可变区域/锁和信号量。原子性是个婊子,她会把你变成她的。不要创建线程,让.net从中抽象出来,并使用更高级别的方法,如async await或task library。甚至可以使用异步工作模式—所有更好的方法。

如果您将运行“alpha”的线程命名为,则不一定(很可能不是)在您的新客户端上拥有/运行处理程序的线程,您可以在其中检查名称

如果需要识别客户机,为什么不给他们一个标识符属性

您在所有表单上都会收到“notthis”消息,因为在下面的一行中

if (x == Thread.CurrentThread.Name)
Thread.CurrentThread.Name
null

之所以发生这种情况,是因为调用
m(textBox1.Text)
的线程是主UI线程,而不是您在实例化名为[thread]的NewClient1对象时创建的线程。主UI线程没有名称集,因此为空

作为一种解决方法,您可以在NewClient1类中创建一个属性,并对其进行设置,然后与该属性的值进行比较

public string NewClientName { get; set; }
. . .
if (x == NewClientName)
{
   . . . 
}
从图形上看,线程调用可以表示为如下所示

+-------------------------+        +--------------------------+
|  Main UI Thread         |        |     NewClient thread     |
|   (Name = null)         |        |     (Name set below)     |
+-------------------------+        +--------------------------+
| on Button Click         |        |                          |
|  > create Thread--------|------> | Create object nc         |
|                         |        | > set this thread's name |
|                         |        |                          |
| on btn2 Click           |        |                          |
|  >invoke mc(txt.Text)   |        |                          |
|   > calls nc.myFunc     |        |                          |
|                         |        |                          |
|//so CurrentThread.Name  |        |                          |
|//is null in this Thread |        |                          |
+-------------------------+        +--------------------------+
+-------------------------+        +--------------------------+
|  Main UI Thread         |        |     NewClient thread     |
|   (Name = null)         |        |     (Name set below)     |
+-------------------------+        +--------------------------+
| on Button Click         |        |                          |
|  > create Thread--------|------> | Create object nc         |
|                         |        | > set this thread's name |
|                         |        |                          |
| on btn2 Click           |        |                          |
|  >invoke mc(txt.Text)   |        |                          |
|   > calls nc.myFunc     |        |                          |
|                         |        |                          |
|//so CurrentThread.Name  |        |                          |
|//is null in this Thread |        |                          |
+-------------------------+        +--------------------------+