Как лучше оформить event? - C#
Формулировка задачи:
Добрый день, имеется такая конструкция вызова эвента:
Она хорошо работает, но хочется узнать, как её можно переписать так чтобы “ TCP_OnReadInvok(string message) //Invoke фунция.” Оказался внутри класса. А с наружи было только один метод с эвентом.
Ниже пример желаемого результата (В результате отсутствует конструкция InvokeRequired, this.BeginInvoke).
namespace name_Space_Main_Form { public partial class Form1 : Form { public Form1() { InitializeComponent(); TCPListener1.TCP_OnReadEven += TCP_OnReadInvok; } public void TCP_OnReadInvok(string message) //Invoke фунция. { if (InvokeRequired) { this.BeginInvoke(new TCP_OnReadDelegate(this.TCP_OnRead), message); } else { TCP_OnRead(message); } } public void TCP_OnRead(string message) { richTextBox1.AppendText("mess: >" + message + "<\r\n"); } } } namespace Name_Space_Class { public delegate void TCP_OnReadDelegate(string sessionId); class Class_Name { public event TCP_OnReadDelegate TCP_OnReadEven; private void ObrabotkaVxodja5egoKlienta(TcpClient Client) { TCP_Client_OnMessIncomingEven?.Invoke(Request); } } }
namespace name_Space_Main_Form { public partial class Form1 : Form { public Form1() { InitializeComponent(); TCPListener1.TCP_OnReadEven += TCP_ OnRead; } public void TCP_OnRead(string message) { richTextBox1.AppendText("mess: >" + message + "<\r\n"); } } }
Решение задачи: «Как лучше оформить event?»
textual
Листинг программы
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Threading.Tasks; namespace WindowsFormsApplication1 { public partial class Form1 : Form { SynchronizationContext ctx; public Form1() { InitializeComponent(); ctx = SynchronizationContext.Current; button1.Click += new EventHandler(button1_Click); } void button1_Click(object sender, EventArgs e) { TestClass test = new TestClass(); test.ClassEvent += new EventHandler(test_ClassEvent); test.Run(); } void test_ClassEvent(object sender, EventArgs e) { ctx.Post((obj) => { label1.Text = "Hello!"; }, null); } } public class TestClass { public event EventHandler ClassEvent; public void Run() { Task.Factory.StartNew(() => { Thread.Sleep(3000); OnClassEvent(EventArgs.Empty); }); } protected virtual void OnClassEvent(EventArgs e) { if (ClassEvent != null) { ClassEvent(this, e); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д