国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 微信小程序 微信開發(fā) 利用C#開發(fā)微信公眾號(hào)之接收事件推送與消息排重的方法介紹

利用C#開發(fā)微信公眾號(hào)之接收事件推送與消息排重的方法介紹

Mar 19, 2017 pm 06:00 PM
c# 微信公眾號(hào)

這篇文章主要介紹利用C#開發(fā)微信公眾號(hào)之接收事件推送與消息排重的方法介紹,詳細(xì)分析了事件推送與消息排重的使用技巧,對(duì)微信開發(fā)有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C#微信公眾號(hào)開發(fā)之接收事件推送與消息排重的方法。分享給大家供大家參考。具體分析如下:

微信服務(wù)器在5秒內(nèi)收不到響應(yīng)會(huì)斷掉連接,并且重新發(fā)起請(qǐng)求,總共重試三次。這樣的話,問題就來(lái)了。有這樣一個(gè)場(chǎng)景:當(dāng)用戶關(guān)注微信賬號(hào)時(shí),獲取當(dāng)前用戶信息,然后將信息寫到數(shù)據(jù)庫(kù)中。類似于pc端網(wǎng)站的注冊(cè)??赡苡捎谶@個(gè)關(guān)注事件中,我們需要處理的業(yè)務(wù)邏輯比較復(fù)雜。如送積分啊,寫用戶日志啊,分配用戶組啊。等等……一系列的邏輯需要執(zhí)行,或者網(wǎng)絡(luò)環(huán)境比較復(fù)雜,無(wú)法保證5秒內(nèi)響應(yīng)當(dāng)前用戶的操作,那如果當(dāng)操作尚未完成,微信服務(wù)器又給我們的服務(wù)器推送了一條相同的關(guān)注事件,我們將再次執(zhí)行我們的那些邏輯,這樣就有可能導(dǎo)致數(shù)據(jù)庫(kù)中出現(xiàn)重復(fù)的數(shù)據(jù)(有的童鞋就會(huì)說(shuō)了,我在插入數(shù)據(jù)之前先判斷當(dāng)前是否已經(jīng)存在了,如果存在了就不執(zhí)行插入的操作。我想說(shuō)的是,我當(dāng)初也是這樣想的,但真實(shí)的運(yùn)行環(huán)境和我們的調(diào)試環(huán)境還是有差距的,直到發(fā)現(xiàn)數(shù)據(jù)庫(kù)中有不少重復(fù)的用戶信息時(shí),我才發(fā)現(xiàn)消息去重的重要性。)。

?
消息的去重普通消息和事件消息是有區(qū)別的。普通消息使用msgid,而事件消息使用FromUserName + CreateTime。我的思路是:
?
新建類BaseMsg,有三個(gè)屬性分別是FromUser,MsgFlag,CreateTime。代碼如下:

代碼如下:

public class BaseMsg
{
        /// <summary>
        /// 發(fā)送者標(biāo)識(shí)
        /// </summary>
        public string FromUser { get; set; }
        /// <summary>
        /// 消息表示。普通消息時(shí),為msgid,事件消息時(shí),為事件的創(chuàng)建時(shí)間
        /// </summary>
        public string MsgFlag { get; set; }
        /// <summary>
        /// 添加到隊(duì)列的時(shí)間
        /// </summary>
        public DateTime CreateTime { get; set; }
}



創(chuàng)建個(gè)靜態(tài)列表_queue,用來(lái)存儲(chǔ)消息列表,列表的類型是List.
在處理微信消息體前,首先判斷列表是否實(shí)例化,如果沒有實(shí)例化則實(shí)例化,否則判斷列表的長(zhǎng)度是否大于或等于50(這個(gè)可以自定義,用處就是微信并發(fā)的消息量),如果大于或等于50,則保留20秒內(nèi)未響應(yīng)的消息(5秒重試一次,總共重試3次,就是15秒,保險(xiǎn)起見這里寫20秒)。
獲取當(dāng)前消息體的消息類型,并根據(jù)_queue判斷當(dāng)前消息是否已經(jīng)請(qǐng)求了。如果是事件則保存FromUser和創(chuàng)建時(shí)間。如果是普通消息則保存MsgFlag。下面是代碼:

代碼如下:

if (_queue == null)
{
 _queue = new List<BaseMsg>();
}
else if(_queue.Count>=50)
{
 _queue = _queue.Where(q => { return q.CreateTime.AddSeconds(20) > DateTime.Now; }).ToList();//保留20秒內(nèi)未響應(yīng)的消息
}
XElement xdoc = XElement.Parse(xml);
var msgtype = xdoc.Element("MsgType").Value.ToUpper();
var FromUserName = xdoc.Element("FromUserName").Value;
var MsgId = xdoc.Element("MsgId").Value;
var CreateTime = xdoc.Element("CreateTime").Value;
MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype);
if (type!=MsgType.EVENT)
{
 if (_queue.FirstOrDefault(m => { return m.MsgFlag == MsgId; }) == null)
 {
     _queue.Add(new BaseMsg
     {
  CreateTime = DateTime.Now,
  FromUser = FromUserName,
  MsgFlag = MsgId
     });
 }
 else
 {
     return null;
 }
       
}
else
{
 if (_queue.FirstOrDefault(m => { return m.MsgFlag == CreateTime; }) == null)
 {
     _queue.Add(new BaseMsg
     {
  CreateTime = DateTime.Now,
  FromUser = FromUserName,
  MsgFlag = CreateTime
     });
 }
 else
 {
     return null;
 }
}



當(dāng)消息已經(jīng)存在隊(duì)列中時(shí),則不轉(zhuǎn)換當(dāng)前的消息為實(shí)體了,直接返回null,調(diào)用的時(shí)候,當(dāng)返回null時(shí)就不做任何處理。

下面開始講解事件消息。接上篇講。所有的消息都繼承BaseMessage,而所有的事件類型都包含一個(gè)Event的屬性。這里為了方便調(diào)用,將消息

代碼如下:

/// <summary>
/// 事件類型枚舉
/// </summary>
public enum Event
{
        /// <summary>
        /// 非事件類型
        /// </summary>
        NOEVENT,
        /// <summary>
        /// 訂閱
        /// </summary>
        SUBSCRIBE,
        /// <summary>
        /// 取消訂閱
        /// </summary>
        UNSUBSCRIBE,
        /// <summary>
        /// 掃描帶參數(shù)的二維碼
        /// </summary>
        SCAN,
        /// <summary>
        /// 地理位置
        /// </summary>
        LOCATION,
        /// <summary>
        /// 單擊按鈕
        /// </summary>
        CLICK,
        /// <summary>
        /// 鏈接按鈕
        /// </summary>
        VIEW,
        /// <summary>
        /// 掃碼推事件
        /// </summary>
        SCANCODE_PUSH,
        /// <summary>
        /// 掃碼推事件且彈出“消息接收中”提示框
        /// </summary>
        SCANCODE_WAITMSG,
        /// <summary>
        /// 彈出系統(tǒng)拍照發(fā)圖
        /// </summary>
        PIC_SYSPHOTO,
        /// <summary>
        /// 彈出拍照或者相冊(cè)發(fā)圖
        /// </summary>
        PIC_PHOTO_OR_ALBUM,
        /// <summary>
        /// 彈出微信相冊(cè)發(fā)圖器
        /// </summary>
        PIC_WEIXIN,
        /// <summary>
        /// 彈出地理位置選擇器
        /// </summary>
        LOCATION_SELECT,
        /// <summary>
        /// 模板消息推送
        /// </summary>
        TEMPLATESENDJOBFINISH
}



定義好枚舉后,就是定義消息實(shí)體了。

關(guān)注/取消關(guān)注事件
xml數(shù)據(jù)包如下:

代碼如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>



對(duì)應(yīng)的實(shí)體:

代碼如下:

/// <summary>
/// 訂閱/取消訂閱事件
/// </summary>
public class SubEventMessage : EventMessage
{
        private string _eventkey;
        /// <summary>
        /// 事件KEY值,qrscene_為前綴,后面為二維碼的參數(shù)值(已去掉前綴,可以直接使用)
        /// </summary>
        public string EventKey
        {
            get { return _eventkey; }
            set { _eventkey = value.Replace("qrscene_", ""); }
        }
        /// <summary>
        /// 二維碼的ticket,可用來(lái)?yè)Q取二維碼圖片
        /// </summary>
        public string Ticket { get; set; }
}



這里需要注意的是,當(dāng)用戶掃描帶參數(shù)的二維碼時(shí),如果用戶沒有關(guān)注當(dāng)前公眾號(hào),用戶關(guān)注時(shí),會(huì)在消息體中帶上qrscene_參數(shù),和Ticket,所以這里定義了兩個(gè)屬性:EventKey,Ticket。當(dāng)給EventKey賦值時(shí),替換掉qrscene_,因?yàn)槲覀冋嬲枰木褪呛竺娴膮?shù)。

掃描帶參數(shù)二維碼事件
用戶掃描帶場(chǎng)景值二維碼時(shí),可能推送一下兩種事件:

如果用戶還未關(guān)注公眾號(hào),則用戶可以關(guān)注公眾號(hào),關(guān)注后微信會(huì)將帶場(chǎng)景值關(guān)注事件推送給開發(fā)者。
如果用戶已經(jīng)關(guān)注公眾號(hào),則微信會(huì)將帶場(chǎng)景值掃描事件推送給開發(fā)者。、
第一種上面已經(jīng)講了,這里就只說(shuō)明下第二種。

用戶已關(guān)注時(shí)的事件推送

xml包如下:

代碼如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>



對(duì)應(yīng)的實(shí)體如下:

代碼如下:

/// <summary>
/// 掃描帶參數(shù)的二維碼實(shí)體
/// </summary>
public class ScanEventMessage : EventMessage
{
 
        /// <summary>
        /// 事件KEY值,是一個(gè)32位無(wú)符號(hào)整數(shù),即創(chuàng)建二維碼時(shí)的二維碼scene_id
        /// </summary>
        public string EventKey { get; set; }
        /// <summary>
        /// 二維碼的ticket,可用來(lái)?yè)Q取二維碼圖片
        /// </summary>
        public string Ticket { get; set; }
}



上報(bào)地理位置事件
當(dāng)公眾號(hào)開啟上報(bào)地理位置功能后,每次進(jìn)入公眾號(hào)會(huì)話時(shí),用戶同意上報(bào)地理位置后,都會(huì)在進(jìn)入時(shí)上報(bào)地理位置,或在進(jìn)入回話后每5秒上報(bào)一次地理位置,公眾號(hào)可以再公眾平臺(tái)的后臺(tái)中修改設(shè)置。上報(bào)地理位置時(shí),微信會(huì)將上報(bào)地理位置事件推送到開發(fā)者填寫的url。

xml數(shù)據(jù)包如下:

代碼如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[LOCATION]]></Event>
<Latitude>23.137466</Latitude>
<Longitude>113.352425</Longitude>
<Precision>119.385040</Precision>
</xml>



對(duì)應(yīng)的實(shí)體如下:

代碼如下:

/// <summary>
/// 上報(bào)地理位置實(shí)體
/// </summary>
public class LocationEventMessage : EventMessage
{
 
        /// <summary>
        /// 地理位置緯度
        /// </summary>
        public string Latitude { get; set; }
        /// <summary>
        /// 地理位置經(jīng)度
        /// </summary>
        public string Longitude { get; set; }
       /// <summary>
        /// 地理位置精度
       /// </summary>
        public string Precision { get; set; }
}



自定義菜單事件常用的事件有:click,view,scancode_puth,scancode_waitmsg,location_select。另外還有三種發(fā)圖的事件,由于并不常用,筆者也沒想到使用場(chǎng)景,再次就不一一講述了,有興趣的可以自己研究下,或者和我進(jìn)行交流。

click事件推送的xml數(shù)據(jù)包:

代碼如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>



view事件推送的xml數(shù)據(jù)包和click的格式是一樣的,所以定義一個(gè)類就可以了,如下:

代碼如下:

/// <summary>
/// 普通菜單事件,包括click和view
/// </summary>
public class NormalMenuEventMessage : EventMessage
{
 
        /// <summary>
        /// 事件KEY值,設(shè)置的跳轉(zhuǎn)URL
        /// </summary>
        public string EventKey { get; set; }
}


scancode事件的xml數(shù)據(jù)包如下:

代碼如下:

<xml><ToUserName><![CDATA[ToUserName]]></ToUserName>
<FromUserName><![CDATA[FromUserName]]></FromUserName>
<CreateTime>1419265698</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[scancode_push]]></Event>
<EventKey><![CDATA[EventKey]]></EventKey>
<ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType>
<ScanResult><![CDATA[http://weixin.qq.com/r/JEy5oRLE0U_urVbC9xk2]]></ScanResult>
</ScanCodeInfo>
</xml>

對(duì)應(yīng)的實(shí)體如下:

代碼如下:

/// <summary>
/// 菜單掃描事件
/// </summary>
public class ScanMenuEventMessage : EventMessage
{
 
        /// <summary>
        /// 事件KEY值
        /// </summary>
        public string EventKey { get; set; }
        /// <summary>
        /// 掃碼類型。qrcode是二維碼,其他的是條碼
        /// </summary>
        public string ScanType { get; set; }
        /// <summary>
        /// 掃描結(jié)果
        /// </summary>
        public string ScanResult { get; set; }
}



至此,當(dāng)前常用的事件類型消息都已定義完畢,結(jié)合上一篇所講的,將xml數(shù)據(jù)包轉(zhuǎn)換成對(duì)象的完整代碼如下:

代碼如下:

public class MessageFactory
{
        private static List<BaseMsg> _queue; 
        public static BaseMessage CreateMessage(string xml)
        {
            if (_queue == null)
            {
                _queue = new List<BaseMsg>();
            }
            else if(_queue.Count>=50)
            {
                _queue = _queue.Where(q => { return q.CreateTime.AddSeconds(20) > DateTime.Now; }).ToList();//保留20秒內(nèi)未響應(yīng)的消息
            }
            XElement xdoc = XElement.Parse(xml);
            var msgtype = xdoc.Element("MsgType").Value.ToUpper();
            var FromUserName = xdoc.Element("FromUserName").Value;
            var MsgId = xdoc.Element("MsgId").Value;
            var CreateTime = xdoc.Element("CreateTime").Value;
            MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype);
            if (type!=MsgType.EVENT)
            {
                if (_queue.FirstOrDefault(m => { return m.MsgFlag == MsgId; }) == null)
                {
                    _queue.Add(new BaseMsg
                    {
                        CreateTime = DateTime.Now,
                        FromUser = FromUserName,
                        MsgFlag = MsgId
                    });
                }
                else
                {
                    return null;
                }
               
            }
            else
            {
                if (_queue.FirstOrDefault(m => { return m.MsgFlag == CreateTime; }) == null)
                {
                    _queue.Add(new BaseMsg
                    {
                        CreateTime = DateTime.Now,
                        FromUser = FromUserName,
                        MsgFlag = CreateTime
                    });
                }
                else
                {
                    return null;
                }
            }
            switch (type)
            {
                case MsgType.TEXT: return Utils.ConvertObj<TextMessage>(xml);
                case MsgType.IMAGE: return Utils.ConvertObj<ImgMessage>(xml);
                case MsgType.VIDEO: return Utils.ConvertObj<VideoMessage>(xml);
                case MsgType.VOICE: return Utils.ConvertObj<VoiceMessage>(xml);
                case MsgType.LINK:
                    return Utils.ConvertObj<LinkMessage>(xml);
                case MsgType.LOCATION:
                    return Utils.ConvertObj<LocationMessage>(xml);
                case MsgType.EVENT://事件類型
                {
                    var eventtype = (Event)Enum.Parse(typeof(Event), xdoc.Element("Event").Value.ToUpper());
                    switch (eventtype)
                    {
                        case Event.CLICK:
                            return Utils.ConvertObj<NormalMenuEventMessage>(xml);
                        case Event.VIEW: return Utils.ConvertObj<NormalMenuEventMessage>(xml);
                        case Event.LOCATION: return Utils.ConvertObj<LocationEventMessage>(xml);
                        case Event.LOCATION_SELECT: return Utils.ConvertObj<LocationMenuEventMessage>(xml);
                        case Event.SCAN: return Utils.ConvertObj<ScanEventMessage>(xml);
                        case Event.SUBSCRIBE: return Utils.ConvertObj<SubEventMessage>(xml);
                        case Event.UNSUBSCRIBE: return Utils.ConvertObj<SubEventMessage>(xml);
                        case Event.SCANCODE_WAITMSG: return Utils.ConvertObj<ScanMenuEventMessage>(xml);
                        default:
                            return Utils.ConvertObj<EventMessage>(xml);
                    }
                } break;
                default:
                    return Utils.ConvertObj<BaseMessage>(xml);
            }
        }
}


以上是利用C#開發(fā)微信公眾號(hào)之接收事件推送與消息排重的方法介紹的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
c#多線程和異步的區(qū)別 c#多線程和異步的區(qū)別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區(qū)別在于,多線程同時(shí)執(zhí)行多個(gè)線程,而異步在不阻塞當(dāng)前線程的情況下執(zhí)行操作。多線程用于計(jì)算密集型任務(wù),而異步用于用戶交互操作。多線程的優(yōu)勢(shì)是提高計(jì)算性能,異步的優(yōu)勢(shì)是不阻塞 UI 線程。選擇多線程還是異步取決于任務(wù)性質(zhì):計(jì)算密集型任務(wù)使用多線程,與外部資源交互且需要保持 UI 響應(yīng)的任務(wù)使用異步。

C#與C:歷史,進(jìn)化和未來(lái)前景 C#與C:歷史,進(jìn)化和未來(lái)前景 Apr 19, 2025 am 12:07 AM

C#和C 的歷史與演變各有特色,未來(lái)前景也不同。1.C 由BjarneStroustrup在1983年發(fā)明,旨在將面向?qū)ο缶幊桃隒語(yǔ)言,其演變歷程包括多次標(biāo)準(zhǔn)化,如C 11引入auto關(guān)鍵字和lambda表達(dá)式,C 20引入概念和協(xié)程,未來(lái)將專注于性能和系統(tǒng)級(jí)編程。2.C#由微軟在2000年發(fā)布,結(jié)合C 和Java的優(yōu)點(diǎn),其演變注重簡(jiǎn)潔性和生產(chǎn)力,如C#2.0引入泛型,C#5.0引入異步編程,未來(lái)將專注于開發(fā)者的生產(chǎn)力和云計(jì)算。

xml怎么轉(zhuǎn)換成json xml怎么轉(zhuǎn)換成json Apr 03, 2025 am 09:09 AM

將 XML 轉(zhuǎn)換為 JSON 的方法包括:使用編程語(yǔ)言(如 Python、Java、C#)編寫腳本或程序進(jìn)行轉(zhuǎn)換;使用在線工具(如 XML 轉(zhuǎn)換為 JSON、Gojko's XML 轉(zhuǎn)換器、XML 在線工具)粘貼或上傳 XML 數(shù)據(jù)并選擇 JSON 格式輸出;使用 XML 到 JSON 轉(zhuǎn)換器(如 Oxygen XML Editor、Stylus Studio、Altova XMLSpy)執(zhí)行轉(zhuǎn)換任務(wù);使用 XSLT 樣式表將 XML 轉(zhuǎn)換為 JSON;使用數(shù)據(jù)集成工具(如 Informatic

c#多線程編程是什么  c#多線程編程用處 c#多線程編程是什么 c#多線程編程用處 Apr 03, 2025 pm 02:45 PM

C# 多線程編程是一種讓程序同時(shí)執(zhí)行多項(xiàng)任務(wù)的技術(shù),它可以通過提升性能、提高響應(yīng)能力和實(shí)現(xiàn)并行處理來(lái)提高程序效率。雖然 Thread 類提供了直接創(chuàng)建線程的方法,但 Task 和 async/await 等高級(jí)工具可以提供更安全的異步操作和更簡(jiǎn)潔的代碼結(jié)構(gòu)。多線程編程中常見的難題包括死鎖、競(jìng)態(tài)條件和資源泄漏,需要仔細(xì)設(shè)計(jì)線程模型和使用適當(dāng)?shù)耐綑C(jī)制來(lái)避免這些問題。

C#.NET:使用.NET生態(tài)系統(tǒng)構(gòu)建應(yīng)用程序 C#.NET:使用.NET生態(tài)系統(tǒng)構(gòu)建應(yīng)用程序 Apr 27, 2025 am 12:12 AM

如何利用.NET構(gòu)建應(yīng)用?使用.NET構(gòu)建應(yīng)用可以通過以下步驟實(shí)現(xiàn):1)了解.NET基礎(chǔ)知識(shí),包括C#語(yǔ)言和跨平臺(tái)開發(fā)支持;2)學(xué)習(xí)核心概念,如.NET生態(tài)系統(tǒng)的組件和工作原理;3)掌握基本和高級(jí)用法,從簡(jiǎn)單控制臺(tái)應(yīng)用到復(fù)雜的WebAPI和數(shù)據(jù)庫(kù)操作;4)熟悉常見錯(cuò)誤與調(diào)試技巧,如配置和數(shù)據(jù)庫(kù)連接問題;5)應(yīng)用性能優(yōu)化與最佳實(shí)踐,如異步編程和緩存。

從網(wǎng)絡(luò)到桌面:C#.NET的多功能性 從網(wǎng)絡(luò)到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

.NET框架與C#:解碼術(shù)語(yǔ) .NET框架與C#:解碼術(shù)語(yǔ) Apr 21, 2025 am 12:05 AM

.NETFramework是一個(gè)軟件框架,C#是一種編程語(yǔ)言。1..NETFramework提供庫(kù)和服務(wù),支持桌面、Web和移動(dòng)應(yīng)用開發(fā)。2.C#設(shè)計(jì)用于.NETFramework,支持現(xiàn)代編程功能。3..NETFramework通過CLR管理代碼執(zhí)行,C#代碼編譯成IL后由CLR運(yùn)行。4.使用.NETFramework可快速開發(fā)應(yīng)用,C#提供如LINQ的高級(jí)功能。5.常見錯(cuò)誤包括類型轉(zhuǎn)換和異步編程死鎖,調(diào)試需用VisualStudio工具。

c#多線程的好處有哪些 c#多線程的好處有哪些 Apr 03, 2025 pm 02:51 PM

多線程的好處在于能提升性能和資源利用率,尤其適用于處理大量數(shù)據(jù)或執(zhí)行耗時(shí)操作。它允許同時(shí)執(zhí)行多個(gè)任務(wù),提高效率。然而,線程過多會(huì)導(dǎo)致性能下降,因此需要根據(jù) CPU 核心數(shù)和任務(wù)特性謹(jǐn)慎選擇線程數(shù)。另外,多線程編程涉及死鎖和競(jìng)態(tài)條件等挑戰(zhàn),需要使用同步機(jī)制解決,需要具備扎實(shí)的并發(fā)編程知識(shí),權(quán)衡利弊并謹(jǐn)慎使用。

See all articles