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

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

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

Добрый день, имеется такая конструкция вызова эвента:
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);
        }
    }
}
Она хорошо работает, но хочется узнать, как её можно переписать так чтобы “ 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_ 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);
            }
        }
    }
}

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


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

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

14   голосов , оценка 3.929 из 5
Похожие ответы