c# 不同线程 事件
时间: 2023-07-27 12:26:20 浏览: 39
在 C# 中,不同线程之间可以通过事件来进行通信。事件通常被定义为委托类型,并且可以在类中定义和引发。
在使用事件时,通常需要定义至少两个方法:一个用于订阅事件,另一个用于引发事件。订阅事件的方法会将一个委托类型的实例添加到事件的委托链中,而引发事件的方法则会遍历委托链并调用其中的每个委托实例。
以下是一个简单的示例,演示如何在不同线程之间使用事件进行通信:
```
using System;
using System.Threading;
public class MyEventClass
{
public event EventHandler MyEvent;
public void RaiseEvent()
{
EventHandler handler = MyEvent;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
public class Program
{
public static void Main()
{
MyEventClass myEventClass = new MyEventClass();
Thread thread1 = new Thread(() =>
{
myEventClass.MyEvent += (sender, e) =>
{
Console.WriteLine("Event handled by Thread 1");
};
});
Thread thread2 = new Thread(() =>
{
myEventClass.MyEvent += (sender, e) =>
{
Console.WriteLine("Event handled by Thread 2");
};
});
thread1.Start();
thread2.Start();
myEventClass.RaiseEvent();
thread1.Join();
thread2.Join();
}
}
```
在上面的示例中,我们定义了一个 `MyEventClass` 类,它包含一个名为 `MyEvent` 的事件。我们还定义了两个线程,分别在其中订阅了 `MyEvent` 事件。最后,我们调用 `RaiseEvent` 方法引发事件,此时将会在不同的线程中执行事件处理程序。
需要注意的是,在订阅事件时,我们需要使用线程安全的方式将委托实例添加到事件的委托链中。在上面的示例中,我们使用了匿名方法来订阅事件,因为匿名方法会自动捕获当前线程的上下文,从而可以确保委托实例被安全地添加到委托链中。