C#,如何实现子线程一直监听数据、父线程定时从全局变量取数据?

请各位大侠提供比较完整的代码,非常非常感谢!!分数不多,愿倾力奉送!!

需求是这样的,子线程一直监听客户端发来的数据,把数据放到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);
}
}

第1个回答  2014-05-16

你这种想法没得问题但是不是最好的, 我推荐你使用事件来推送

思路如下:

    子线程监听客户端发送的消息

    当子线程收到消息之后,  建立一份数据的拷贝   然后清楚buffer   向父线程通过事件推送此数据

    父线程订阅该事件,拿到推送过来的数据直接处理


这样做的好处比你那个来讲,

    不需要考虑线程同步的问题

    使用的推模式   而不是拉模式(轮询模式)


如果不会写的话,可以留言,我可以帮你写一个。

C#,如何实现子线程一直监听数据、父线程定时从全局变量取数据?
思路如下:子线程监听客户端发送的消息 当子线程收到消息之后, 建立一份数据的拷贝 然后清楚buffer 向父线程通过事件推送此数据 父线程订阅该事件,拿到推送过来的数据直接处理 这样做的好处比你那个来讲,不需要考虑线程同步的问题 使用的推模式 而不是拉模式(轮询模式)如果不会写的话,可以留...

C#语言中子窗体输入查询条件如何在父窗体的GridView中显示查询结果_百 ...
如果要实现楼主你说的这个功能的话,你需要在主窗体下建一个public公用的变量用来保存查询条件,就是在有datagridview的窗体下。例如: public string sqlwhere;然后当你子窗体关闭的时候把你输入的条件赋值给sqlwhere。然后在主窗体下用新的条件重新刷新窗口。写一个简单的例子吧,比如两个窗体是form1和...

C#多线程同用全局变量,怎样保持每个线程的变量不会被别的线程把值覆盖...
HashTable,每个线程用key往自己的value里面写东西,外界通过key访问每个线程写的东西,同理,dataTable也行啊,只要用标识区分开不同的row就可以了,或是每个线程一个dataTable,都放到dataSet中,通过表名就取到了。介绍:在一个程序中,这些独立运行的程序片断叫作“线程”,利用它编程的概念就叫作“多线程...

C#多线程同用一个全局变量,如何保持每个线程的变量不会被别的线程把值...
HashTable,每个线程用key往自己的value里面写东西,外界通过key访问每个线程写的东西,同理,dataTable也行啊,只要用标识区分开不同的row就可以了,或是每个线程一个dataTable,都放到dataSet中,通过表名就取到了

C#多线程怎么锁定全局变量?
只要加上一下代码就可以了:public static object locker = new object();\/\/添加一个对象作为锁 就是在有修改的时候加上lock lock (locker)\/\/锁 { \/*添加过程*\/ dictionary.Add("...", DateTime.Now); } lock (locker)\/\/锁 { \/*删除过程*\/ dictionary.Remove("..."); } ...

C# 多线程问题
设置全局变量,这个不可取,在多线程中,如果只有一层这样的线程,还可控,如果层数多了,又是加又是减的,根本控制不了。最后出问题都不知道怎么分析,多线程在分析问题时,有些问题还可重现,有些问题十次能重现一次就不错了。也在做这方面的研究,有时间可以交流一下,看看你们的设计。

C#中如何在一个窗体中调用另一个窗体控件中的数据?
1、首先在窗体上增加如下的三个控件,两个label,一个button,我们要实现的效果是label1每一秒增加一个数字,label2每点击一下button增加一下数字。2、用到了定时任务,如下是两个定时任务的代码,一个是手动定时任务,就是我们点击按钮以后执行的,另一个是自动的订单是任务,程序运行以后执行的。3、...

C# 几个线程同时调用一个方法会出问题吗?
看你的方法与全局变量或者某一对象有没有关系, 如果有, 那么结果肯定是错的, 如果没有全局变量和对象, 只是处理返回计算结果的话, 那么没有问题

VC多线程访问同一全局变量的问题
WaitForSingleObject(pFrameInQueue->m_mutex,INFINITE);ReleaseMutex(pFrameInQueue->m_mutex); 需要成对的出现.你在if判断里边释放一次 但是如果if条件不成立,你就没有调用释放.这样的结果就是互斥量mutex被锁定,其他线程无法调用.在2个if判断外加上释放mutex的语句再试一试 ...

C++线程更新变量问题
再次,你要“监听”某全局变量,可以在线程中使用循环方式 while(退出线程标志){ if(变量值值改变了){ 调用你的函数 } Sleep(10);\/\/腾出一点空闲 } “或者每隔一段时间刷新变量,运线程函数”这句不明白你是要怎么做。最后,线程传参可以传入你需要的所有参数,具体的可以QQ(私信发送你的Q给我...

相似回答