高效的.Net UDP異步編程實(shí)現(xiàn)分析
CodeProject上有個(gè)例子是開(kāi)個(gè)線程去同步接收,這樣倒是可以滿足我的程序需求,不過(guò)實(shí)際中遇到幾個(gè)問(wèn)題:
1.程序開(kāi)銷大,內(nèi)存狂飆,接一次數(shù)據(jù)就要重新開(kāi)一次線程
2.由于主界面和底層是完全隔離只是通過(guò)中間的接口來(lái)通訊,導(dǎo)致線程總是不能正常的結(jié)束,程序結(jié)束后還有一個(gè)進(jìn)程在那里不知道干什么.
于是翻閱MSDN,查找自己以前寫(xiě)的代碼,最后還是決定用異步來(lái)接收,MSDN上UDP異步的例子不太好,有點(diǎn)敷衍的意思,用異步很好的解決了以上的問(wèn)題,高效完成效率,代碼如下:
UdpClient qq_client; //Udp客戶端
qq_client = new UdpClient();
IPEndPoint remoteQQEP = new IPEndPoint(remotehost, remoteport);
qq_client.Connect(remoteQQEP);
AsyncCallback GetRecvBuffer = new AsyncCallback(ReceiveCallback);
qq_client.BeginReceive(GetRecvBuffer, null);
這里用一個(gè)GetRecvBuffer的回掉來(lái)實(shí)現(xiàn)異步
private void ReceiveCallback(IAsyncResult ar)
{
try
{
lock (this)
{
byte[] recvbytes = qq_client.EndReceive(ar, ref remoteQQEP);
//QQFunction.DebugDump(recvbytes);
if (recvbytes[0] != QQDef.QQ_IM_HEAD && recvbytes[0] != 0x03)
{
//非QQ數(shù)據(jù)包
return;
}
switch (Pop16(recvbytes, 3))
{
case QQDef.QQ_REQUEST_TOKEN:
DoGetToken(recvbytes);
break;
case QQDef.QQ_REQUEST_LOGIN:
DoGetLogin(recvbytes);
break;
case QQDef.QQ_GET_ONLINE_FRIEND:
DoGetOnline(recvbytes);
break;
case QQDef.QQ_KEEP_ALIVE:
CheckAlive(recvbytes);
break;
case QQDef.QQ_SEND_IM_MSG:
// Do SomeThing
break;
case QQDef.QQ_RECV_IM_MSG:
DoRecvMsg(recvbytes);
break;
default:
QQFunction.DebugDump("UnKnow Command");
QQFunction.DebugDump(recvbytes);
break;
}
}
lock (this)
{
AsyncCallback GetRecvBuffer = new AsyncCallback(ReceiveCallback);
qq_client.BeginReceive(GetRecvBuffer, null);
}
}
catch
{
}
}
代碼是不是很簡(jiǎn)單?功能是不是很強(qiáng)大?
相關(guān)文章
GridView使用CommandField刪除列實(shí)現(xiàn)刪除時(shí)提示確認(rèn)框
在.net2005提供的GridView中我們可以直接添加一個(gè)CommandField刪除列完后在它的RowDeleting事件中完成刪除2013-09-09Asp.Net中的Action和Func委托實(shí)現(xiàn)
這篇文章主要介紹了Asp.Net中的Action和Func委托的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12asp.net網(wǎng)站開(kāi)發(fā)包wq.dll打包下載
這個(gè)wq.dll主要是用來(lái)給Web群和C#聯(lián)盟群及GUI群的朋友使用的,其它群和使用控件開(kāi)發(fā)web的朋友可以直接無(wú)視,這個(gè)封裝好的包是一個(gè)基礎(chǔ)開(kāi)發(fā)包,可以輕松的幫你完成一些小型網(wǎng)站的開(kāi)發(fā),支持.Net Framework2.0(及以上平臺(tái))。2009-10-10this connector is disabled錯(cuò)誤的解決方法
打開(kāi)editor/filemanager/connectors/aspx/config.ascx修改CheckAuthentication()方法,返回true2008-11-11asp.net使用jquery模板引擎jtemplates呈現(xiàn)表格
這篇文章主要介紹了asp.net使用jquery模板引擎jtemplates呈現(xiàn)表格的示例,大家參考使用吧2014-01-01.Net 文本框?qū)崿F(xiàn)內(nèi)容提示的實(shí)例代碼(仿Google、Baidu)
這篇文章主要介紹了.Net 文本框?qū)崿F(xiàn)內(nèi)容提示的實(shí)例代碼,需要的朋友可以參考下2014-02-02asp.net通過(guò)消息隊(duì)列處理高并發(fā)請(qǐng)求(以搶小米手機(jī)為例)
這篇文章主要介紹了asp.net通過(guò)消息隊(duì)列處理高并發(fā)請(qǐng)求(以搶小米手機(jī)為例),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03asp.net SqlDataAdapter對(duì)象使用札記
如果 DataAdapter 遇到多個(gè)結(jié)果集,它將在 DataSet 中創(chuàng)建多個(gè)表。將向這些表提供遞增的默認(rèn)名稱 TableN,以表示 Table0 的“Table”為第一個(gè)表名。2009-04-04