我想請教一下關于C#監聽事件的一個問題,舉個例子:假設我要監聽一個讀取資料的函式,當資料讀取到100個時觸發,然后將這100個讀取到的資料傳給另外一個資料處理函式去處理,然后我這邊繼續讀取資料,請問這個帶引數直接傳遞還是需要通過另一種方式傳遞啊,因為我是初學者,目前還處于學習階段,請大家指點一下,謝謝
uj5u.com熱心網友回復:
樓主你可以了解一下委托uj5u.com熱心網友回復:
您可以寫一個大致的框架嗎,因為我只會寫不帶引數的委托
uj5u.com熱心網友回復:
delegate void Evt(byte[] data);
Evt DataRead = new Evt(dataread =>
{
//On Data Read
});
public void ReadData()
{
var dataread = new byte[100];
DataRead?.Invoke(dataread);
}
uj5u.com熱心網友回復:
https://blog.csdn.net/dqs78833488/article/details/51331341uj5u.com熱心網友回復:
可以各種方式寫,幫你簡單的寫了一下:界面如下圖:
uj5u.com熱心網友回復:
public partial class Form1 : Form
{
private Random r = new Random();
private static object obj= new object();
private bool CanExit=false;
private DataProcess<List<int>> p = new DataProcess<List<int>>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ListDataRead);
thread.IsBackground=true;
thread.Start();
//用事件去接收資料是為了模擬有另外的資料處理程式
p.DataReadCompleteHandlerEvent += new Action<List<int>>(DataReceive_Complete);
}
private void DataReceive_Complete(List<int> list)
{
if (list != null)
{
AppendText("收到新資料個數" + list.Count.ToString());
for (int i = 0; i < list.Count; i++)
{
AppendText(list[i].ToString());
}
}
}
private void AppendText(string strInfo)
{
if (textBox1.InvokeRequired)
{
var _handler = new Action<string>(AppendText);
textBox1.BeginInvoke(_handler, strInfo);
}
else
{
textBox1.AppendText(strInfo + Environment.NewLine);
}
}
private void ListDataRead()
{
Monitor.Enter(obj);
List<int> list = new List<int>();
while (!CanExit)
{
int data = ReadData();
list.Add(data);
if (list.Count >= 100)
{
p.Process100Data(list);
list.Clear();
}
Thread.Sleep(10);
}
Monitor.Exit(obj);
}
/// <summary>
/// 模擬讀取資料函式
/// </summary>
private int ReadData()
{
int data=https://bbs.csdn.net/topics/ r.Next(0,1000);
return data;
}
}
uj5u.com熱心網友回復:
資料專用的處理類:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WindowsFormsApplication8
{
public class DataProcess<T>
{
public Action<T> DataReadCompleteHandlerEvent;
public void Process100Data(T data)
{
if (DataReadCompleteHandlerEvent != null)
{
DataReadCompleteHandlerEvent.Invoke(data);
}
}
}
}
uj5u.com熱心網友回復:
謝我謝看了您的例子,我好像懂了很多
uj5u.com熱心網友回復:
UI執行緒為了防止阻塞,所以要用委托。或者異步多執行緒。不然會卡死界面,直到邏輯完成轉載請註明出處,本文鏈接:https://www.uj5u.com/net/130307.html
標籤:C#
下一篇:fast report圖片框
