通过委托和事件异步传递数据
今天带大家了解一下委托和事件
直接上代码
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