Как лучше оформить 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);
}
}
}
}