多线程处理,求帮助

savagewang 2012-09-30 05:38:19
一直只是做对数据库的低级处理,遇到一个问题,求帮助:
有两个socket接受进程,分别是snmp 和telnet字符流截取,对取到的字符处理后入同一个表,遇到的问题是由于snmp那个量比较大,在对取到的字符插入表时,会出现阻赛,也就是一部分后续字符在我插入前一条时丢掉了。因此考虑用多线程实现,但是没用过,我写写我的思路,请各位指正,谢谢!



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Data.SqlClient;
using System.Data;

namespace EOSS
{
class Program
{
System.Data.DataSet box; //公用的dataset,用来存放处理后,准备入库的数据。再每10秒钟将box里的数据插入数据库。
System.Data.DataSet snmpconfig; //通过查询数据库中snmpconfig表,每小时取一次。
System.Data.DataSet telnetconfig; //通过查询数据库中telnetconfig表,每小时取一次。

static void Main(string[] args)
{




System.Timers.Timer TH = new System.Timers.Timer();//每小时用的定时器
//TH.Elapsed += new System.Timers.ElapsedEventHandler(onTimer);//这行出错 “错误 10 非静态的字段、方法或属性“EOSS.Program.onTimer(object, System.Timers.ElapsedEventArgs)”要求对象引用 ”
TH.Interval = 6000;
TH.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
TH.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
TH.Start();


Timer T10 = new Timer(boxtodatabase,null,0,60000);//10秒钟调用一次,将box中的内容插入数据库。
while (true)
{
//这里完全不知道 怎么写了,


}

}

private static void boxtodatabase(object state)//执行将box中数据放入数据库
{
SqlDataAdapter boxda = new SqlDataAdapter();
boxda.Update();//不写了,具体的
}

protected void onTimer(object sender, System.Timers.ElapsedEventArgs e) //每1小时取查询数据库中两个config表,
{
string snmpconfigtxt = "select * from snmpconfig";
SqlCommand cmd1 = new SqlCommand(snmpconfigtxt);
SqlDataAdapter sda1 = new SqlDataAdapter();
sda1.Fill(snmpconfig);
//下面是取telnetconfig的,同上不写了。
////
////
}

private string snmp1() //将snmp取到的字符返回。
{
//这个我写好了。
return null;
}
private string telnet1() //将telnet截取的字符返回。
{
//这个我也写好了。
return null;
}
private void snmptobox(string s) //snmp 字符处理后放入 box
{
foreach (DataRow sc in snmpconfig.Tables[0].Rows)
{
if (s == sc["告警名称"])
{
DataRow newb = box.Tables[0].NewRow();
newb["告警信息"] = s;
box.Tables[0].Rows.Add(newb);
//向box插入一条匹配的告警信息。

}

}
}




}
}


...全文
156 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
savagewang 2012-10-16
  • 打赏
  • 举报
回复
我怎么告诉?snmp的trap recive ,不好操作吧
savagewang 2012-10-01
  • 打赏
  • 举报
回复
不是丢包,我socket 不是有个buffer吗,我设到64*1024,但是我不用多线程的话,这个buffer再大也没用阿,因为我插入数据库的这个操作时间内,buffer是不接收消息的,要等我的insert完成后,这次while结束,从头来监听,判断,入库,原来的逻辑就是这样的,所以我才要改,还有一个原因是insert之后,很多个表的触发器关联,所以insert的时间挺长的。

BinaryTreeEx 2012-10-01
  • 打赏
  • 举报
回复
你说的丢数据如果是指通信时的丢包现象,那么你的通信协议有问题,和数据库操作没关系
BinaryTreeEx 2012-10-01
  • 打赏
  • 举报
回复
接受完数据后,告诉对方不要发数据,然后执行数据库操作,完成后再告诉对方发数据。就这么循环处理
xiedingan 2012-09-30
  • 打赏
  • 举报
回复

ThreadPool.QueueUserWorkItem(h =>
{
while (true)
{
//这里写入
Thread.Sleep(10000);
}
});

xiedingan 2012-09-30
  • 打赏
  • 举报
回复

ThreadPool.QueueUserWorkItem(h =>
{
while (true)
{
//这里写入
Thread.Sleep(10000);
}
}
});

109,897

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧