Как лучше оформить event? - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, имеется такая конструкция вызова эвента:
Листинг программы
  1. namespace name_Space_Main_Form
  2. {
  3. public partial class Form1 : Form
  4. {
  5. public Form1()
  6. {
  7. InitializeComponent();
  8. TCPListener1.TCP_OnReadEven += TCP_OnReadInvok;
  9. }
  10. public void TCP_OnReadInvok(string message) //Invoke фунция.
  11. {
  12. if (InvokeRequired)
  13. {
  14. this.BeginInvoke(new TCP_OnReadDelegate(this.TCP_OnRead), message);
  15. }
  16. else
  17. {
  18. TCP_OnRead(message);
  19. }
  20. }
  21. public void TCP_OnRead(string message)
  22. {
  23. richTextBox1.AppendText("mess: >" + message + "<\r\n");
  24. }
  25. }
  26. }
  27. namespace Name_Space_Class
  28. {
  29. public delegate void TCP_OnReadDelegate(string sessionId);
  30. class Class_Name
  31. {
  32. public event TCP_OnReadDelegate TCP_OnReadEven;
  33. private void ObrabotkaVxodja5egoKlienta(TcpClient Client)
  34. {
  35. TCP_Client_OnMessIncomingEven?.Invoke(Request);
  36. }
  37. }
  38. }
Она хорошо работает, но хочется узнать, как её можно переписать так чтобы “ TCP_OnReadInvok(string message) //Invoke фунция.” Оказался внутри класса. А с наружи было только один метод с эвентом. Ниже пример желаемого результата (В результате отсутствует конструкция InvokeRequired, this.BeginInvoke).
Листинг программы
  1. namespace name_Space_Main_Form
  2. {
  3. public partial class Form1 : Form
  4. {
  5. public Form1()
  6. {
  7. InitializeComponent();
  8. TCPListener1.TCP_OnReadEven += TCP_ OnRead;
  9. }
  10. public void TCP_OnRead(string message)
  11. {
  12. richTextBox1.AppendText("mess: >" + message + "<\r\n");
  13. }
  14. }
  15. }

Решение задачи: «Как лучше оформить event?»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11.  
  12. namespace WindowsFormsApplication1 {
  13.     public partial class Form1 : Form {
  14.         SynchronizationContext ctx;
  15.         public Form1() {
  16.             InitializeComponent();
  17.             ctx = SynchronizationContext.Current;
  18.             button1.Click += new EventHandler(button1_Click);
  19.         }
  20.  
  21.         void button1_Click(object sender, EventArgs e) {
  22.             TestClass test = new TestClass();
  23.             test.ClassEvent += new EventHandler(test_ClassEvent);
  24.             test.Run();
  25.         }
  26.  
  27.         void test_ClassEvent(object sender, EventArgs e) {
  28.             ctx.Post((obj) => {
  29.                 label1.Text = "Hello!";
  30.             }, null);
  31.         }
  32.     }
  33.     public class TestClass {
  34.         public event EventHandler ClassEvent;
  35.  
  36.         public void Run() {
  37.             Task.Factory.StartNew(() => {
  38.                 Thread.Sleep(3000);
  39.                 OnClassEvent(EventArgs.Empty);
  40.             });
  41.         }
  42.         protected virtual void OnClassEvent(EventArgs e) {
  43.             if (ClassEvent != null) {
  44.                 ClassEvent(this, e);
  45.             }
  46.         }
  47.     }
  48. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы