数据来的一时快,一时慢,如何避免
发布时间:2011-06-21 11:33:28 文章来源:www.iduyao.cn 采编人员:星星草
数据来的一时快,一时慢,如何处理
先上我接收UDP的代码,问题在后面
private void button31_Click(object sender, RoutedEventArgs e)
{
thread1 = new Thread(Acc);
thread1.Start();
button31.IsEnabled = false;
}
private void Acc()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 8899);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); //绑定已使用端口 (也许是程序死机前用的端口)
socket.Bind(iep);
ep = (EndPoint)iep;
byte[] bytes = new byte[1024];//设置缓冲数据流长度是1024
while (true)
{
string receiveData;
socket.ReceiveFrom(bytes, ref ep);
receiveData = System.Text.Encoding.Unicode.GetString(bytes);
receiveData = receiveData.TrimEnd('u0000');
if (receiveData.Length > 0)
{
//textBox1.Text = "来自" + ep.ToString() + "的消息" + receiveData;
TextBoxCallback tx = SetTextBox;
this.Dispatcher.Invoke(tx, receiveData);
Array.Clear(bytes, 0, 1024);//数组初清零
}
}
}
delegate void TextBoxCallback(string str);//是接收来网络K发射机传来的文本
ArrayList uiyi = new ArrayList();//用来存接收数据
public void SetTextBox(string str)
{
uiyi.Add(str);
}
我用上面的代码来接收UDP数据,我UDP发射端每秒最多发射120次,也就是发射120行数据,我这里接收用"SetTextBox"方法,将数据直接放入ArrayList数组,测试很长时间,ArrayList uiyi 都能收到全部发射数据。但我的数据要分析处理,我就在“public void SetTextBox”直接进行对数据的加减乘除,在发射端时间间隔一样时,每秒120次的数据量时,对数据的加减乘除处理都未影响接收UDP数据。但实际工作中发射端发射数据一时多,一时少,但都没有超过每秒120次,这时数据处理就影响我的接收了,数据收不全了。如将数据放入ArrayList中,数据是全部收到的。
我想问的是:有什么方法能将接收到的UDP数据缓存一下,再对数据进行加减乘除。我用过生产者消费者模式的lock,可能没写对,数据还是不全。
------解决方案--------------------
生产者消费者模式是可以的,很简单,用ArrayList不是很好,缓冲的数据最好存在队列里,队列最好是用LinkedList实现比较容易操作,
生产者和消费者都直接lock(LinkedList),然后生产者接收到数据后,往LinkedList末尾添加,而消费者,处理数据的程序则从LinkedList开头取数据处理,完之后删除这个数据,
这样一直到LinkedList为空为止,
------解决方案--------------------
引用其它文章
Queue与线程的应用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace 集合
{
class 队列
{
public static void Main()
{
//队列: 元素以先进先出的方式来处理的集合(FIFO-First In First Out)第一个来,第一个滚
//例:飞机登记排队,靠前的就先上飞要,不过队列有优先级,如商务仓的队与经济仓的队,是两个不同的队,而商务优先
//在.Net技术中, using System.Collections.Generic.Queue<T>是队列的泛型版本实现
// System.Collections.Queue是非泛型的实现,参数是Object
//public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable
//从队列的定义可以看出,它实现了跌代,集合接口 ,它没有实现ICollection<T>这个接口,因为其中定义的Add Remove方法会破坏队列
//队列与列表主要区别就是在于,它没有实现IList接口
//所以,不可以用索引器访问队列,队列只允许添加元素,该元素只能放在队列的最后(Enqueue()),还有就是从头部取元素Dequeue()
//Enqueue从队列的后面插入元素,而 Dequeue在取一个元素的同时,会前取出的元素删除,如再再调用一次,就删除下一个元素
//方法简介 :
// Enqueue() 一端插入元素
// Dequeue() 从头部读取和删除一个元素,如果调用方法时,队列中没有元素,刨出InvalidOperationException异常
// Peek() 在队列头部读取一个元素,但是,不删除它
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
C#读取文本并入库
文本格式固定如下:
**********************:
<中文作者一>=赵逢玲
<中文作者二>=杜秀华
<中文作者三>=王翠东
<中...
-
C#操作Word文档(Office 2007)
首先引入类库,Microsoft.Office.Interop.Word,然后进行编程。代码如下:
using ...
-
请问,ReadLine方法读取文件
一个txt文件,有两行
aaaa
bbbb
代码:
string s1 = @"D:iosamplepp.txt";
using (StreamReader sr = new...
-
验证控件
在gridview页脚行添加了验证控件,可是点击编辑更新时触发了验证事件,无法更新,怎么办?
------解决方案-------------------...
-
在BITMAP上用GDI+画图,如何使画出的图像尽可能清晰?
我在一张bitmap上用GDI+绘制了简单的多边形,并用PictureBox显示。
我发现,如果我...
-
???如何利用webbrower获取ifream元素????
如何利用webbrower获取ifream元素.我在GOOGLE,BAIDU一整天依然无法找到解决方法!!希望各...
-
如何解决“已有打开的与此命令相关联的DataReader,必须首先将它关闭。”错误?
小弟写了一个DBHelper类来控制数据库访问,但是在实际...
-
在做asp.net项目时,在做数据库更新时出现',' 附近有语法错误。(数据库是用sql2000的)
数据库更新语句:
public void Update()
...
-
为什么我这段代码不会发出声音呢?
C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
usi...
-
ClickOnce 不支持请求执行级别requireAdministrator
写了一个应用程序,使用ServiceController控制 windows服务的的启动和停止。
...