
C#,如何实现子线程一直监听数据、父线程定时从全局变量取数据? 20
请各位大侠提供比较完整的代码,非常非常感谢!!分数不多,愿倾力奉送!!需求是这样的,子线程一直监听客户端发来的数据,把数据放到publicstatic变量byte[]bu...
请各位大侠提供比较完整的代码,非常非常感谢!!分数不多,愿倾力奉送!!
需求是这样的,子线程一直监听客户端发来的数据,把数据放到public static变量byte[] buffer里。父线程每60s去读buffer的值,读到以后将buffer清空,然后子线程继续往buffer里写数据,如此循环。
刚接触多线程,了解得不多,不知道用何种方式来实现?主要是效率问题,因为数据量比较大,60s大概500k左右的数据需要接收和处理。
有这样几个小问题:
1. 子线程修改了buffer的值以后,父线程怎么访问到呢?
2. 清空buffer的逻辑,写在主线程Do()里面好呢,还是写在子线程里呢?
我了解了下异步回调,照着写了几句代码,仅供各位大侠参考,不知道可不可行?
public partial class fmConsole : Form
{
private delegate void ListenHandle();
public fmConsole()
{
InitializeComponent();
}
// 主函数启动接收程序和时间驱动的程序
private void btnStart_Click(object sender, EventArgs e)
{
Calculator Calc = new Calculator();
ListenHandle lh = new ListenHandle(StartListen);
lh.BeginInvoke(new AsyncCallback(ClearBuffer), lh);
// Do()方法中,每隔60s会去buffer的数据,然后计算
mainCalc.Do();
}
// TCPreceive1里实现了一直监听的逻辑,这是别人写的代码,
// 我不想改,想直接调用,但不知道StartListen运行之后,子线程就会一直监听,还是说,需要再while(true)一下,即类似while(true){startListen()}之类的??
private void StartListen()
{
Receiver r = new Receiver();
ThreadPool.QueueUserWorkItem(new WaitCallback(r.TCPreceive1), "TCP接收线程1");
}
// 我想在这个方法里,清空buffer的值,不知道可不可行?
private void ClearBuffer(IAsyncResult ar)
{
ListenHandle lh = ar.AsyncState as ListenHandle;
lh.EndInvoke(ar);
Array.Clear(buffer, 0, buffer.Length);
}
} 展开
需求是这样的,子线程一直监听客户端发来的数据,把数据放到public static变量byte[] buffer里。父线程每60s去读buffer的值,读到以后将buffer清空,然后子线程继续往buffer里写数据,如此循环。
刚接触多线程,了解得不多,不知道用何种方式来实现?主要是效率问题,因为数据量比较大,60s大概500k左右的数据需要接收和处理。
有这样几个小问题:
1. 子线程修改了buffer的值以后,父线程怎么访问到呢?
2. 清空buffer的逻辑,写在主线程Do()里面好呢,还是写在子线程里呢?
我了解了下异步回调,照着写了几句代码,仅供各位大侠参考,不知道可不可行?
public partial class fmConsole : Form
{
private delegate void ListenHandle();
public fmConsole()
{
InitializeComponent();
}
// 主函数启动接收程序和时间驱动的程序
private void btnStart_Click(object sender, EventArgs e)
{
Calculator Calc = new Calculator();
ListenHandle lh = new ListenHandle(StartListen);
lh.BeginInvoke(new AsyncCallback(ClearBuffer), lh);
// Do()方法中,每隔60s会去buffer的数据,然后计算
mainCalc.Do();
}
// TCPreceive1里实现了一直监听的逻辑,这是别人写的代码,
// 我不想改,想直接调用,但不知道StartListen运行之后,子线程就会一直监听,还是说,需要再while(true)一下,即类似while(true){startListen()}之类的??
private void StartListen()
{
Receiver r = new Receiver();
ThreadPool.QueueUserWorkItem(new WaitCallback(r.TCPreceive1), "TCP接收线程1");
}
// 我想在这个方法里,清空buffer的值,不知道可不可行?
private void ClearBuffer(IAsyncResult ar)
{
ListenHandle lh = ar.AsyncState as ListenHandle;
lh.EndInvoke(ar);
Array.Clear(buffer, 0, buffer.Length);
}
} 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询