通过委托和事件异步传递数据

今天带大家了解一下委托和事件
直接上代码
1、首先定义传输的数据类型,个人写例子的时候比较习惯Student或Person,你们随意

 public class Student
 {
     public int Id { get; set; }
     public string Name { get; set; }
     public int Age { get; set; }
 }

2、继承一下事件基类

public class StudentEventArgs:EventArgs
{
    public Student Student { get; set; }
    public StudentEventArgs(Student student)
    {
        Student = student;
    }
}

3、开始写例子,模拟了一条张三的数据,放入事件中

 public class TestSample
 {
     public event EventHandler<StudentEventArgs> SimulateCompleted;
     private void OnSimulateCompleted(Student student)
     {
         SimulateCompleted?.Invoke(this, new StudentEventArgs(student));
     }

     public void SimulateData()
     {
         Student student = new Student()
         {
             Id = 1,Name="张三",Age=18
         };
         OnSimulateCompleted(student);
     }
 }

4、在控制台拿到数据,这里我只是打印出Name=张三,一般传递数据的时候,可以封装成List,也可以从数据库拿取

 internal class Program
 {
     static void Main(string[] args)
     {
         TestSample testSample = new TestSample();
         testSample.SimulateCompleted += ShowValue;
         testSample.SimulateData();       
     }

     public static void ShowValue(object obj,StudentEventArgs e)
     {
         Console.WriteLine(e.Student.Name);
     }

5、扩展一下,Program拿到了TestSample的数据,那么现在Program给TestSample发送数据
直接上代码

public class TestSample
{
    public event EventHandler<StudentEventArgs> SimulateCompleted;
    private void OnSimulateCompleted(Student student)
    {
        SimulateCompleted?.Invoke(this, new StudentEventArgs(student));
    }

    public string Message { get; set; }

    public void SimulateData(Func<string> callback)
    {
        Student student = new Student()
        {
            Id = 1,Name="张三",Age=18
        };
        Message=callback.Invoke();
        OnSimulateCompleted(student);
    }
}
internal class Program
{
    static void Main(string[] args)
    {
        TestSample testSample = new TestSample();
        testSample.SimulateCompleted += ShowValue;
        testSample.SimulateData(() => { return "你好"; });
        Console.WriteLine("==========================");
        Console.WriteLine(testSample.Message);     
    }

    public static void ShowValue(object obj,StudentEventArgs e)
    {
        Console.WriteLine(e.Student.Name);
    } 
}

TestSample使用Func callback来接收数据传递给Message,之后打印在控制台

posted @ 2023-10-23 16:13  孤沉  阅读(10)  评论(0编辑  收藏  举报