国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

在Asp.net中調(diào)用異步方法-使用信號量

2019-11-18 17:03:43
字體:
供稿:網(wǎng)友

    有些庫可能只提供了異步方法,而asp.net確是同步的,這次就遇到一個問題:頁面顯示出來以后才會執(zhí)行回調(diào)函數(shù)。而我需要的流程是:在回調(diào)函數(shù)中執(zhí)行驗證,然后才能呈現(xiàn)頁面。Mutex,AutoResetEvent提供了通過信號量來協(xié)調(diào)線程執(zhí)行步驟的方法。
    XmppClientConnection是agsxmppJabber庫中的類,調(diào)用Open會立即返回客戶端(ie)呈現(xiàn)該頁面,而不管是否成功,同時會在另一個線程會執(zhí)行登陸,新建帳戶的操作,成功后會觸發(fā)回調(diào)事件,這樣一來頁面呈現(xiàn)后才會執(zhí)行回調(diào),不符合我們要的邏輯。我們把調(diào)用Open的線程叫做:Jabber線程,把執(zhí)行登陸的線程叫做:Jabber線程的輔助線程。

    我最初的想法是使用Moniter,代碼:


PRivate object objlock=new object();
        public void RegisterJab(string username, string passWord, string server)
        {

            _connection.Server = server;
            _connection.Username = username;
            _connection.Password = password;
            _connection.Port = 80;
            _connection.UseSSL = false;
            _connection.AutoResolveConnectServer = true;
            _connection.ConnectServer = null;
            _connection.SocketConnectionType = agsXMPP.net.SocketConnectionType.Direct;
            _connection.UseStartTLS = true;
            _connection.RegisterAccount = true;
            Moniter.Enter(objlock);
            _connection.Open();
            Moniter.Wait(objlock);
            _connection.Close();

        }
        private void XmppCon_OnRegistered(object sender)
        {
            IsSuccessfull = true;
            Moniter.Exit(objlock);
        }

 

    在執(zhí)行Moniter.Exit()時會拋出異常:SynchronizationLockException,因為Jabber輔助線程并不是鎖的擁有者.發(fā)現(xiàn)Moniter很像臨界區(qū),并不適處理這種情況合。
    后來,轉(zhuǎn)到了Mutex,Mutex: 是同步基元,它只向一個線程授予對共享資源的獨(dú)占訪問權(quán)。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。
    Mutex很合適這個功能的實現(xiàn),可是還有沒有更簡便的方法呢?那就是AutoResetEvent:允許線程通過發(fā)信號互相通信。通常,此通信涉及線程需要獨(dú)占訪問的資源。最重要的是他提供了線程間通訊的方法,這樣可以更靈活的控制線程的調(diào)用步驟,我們用到的就是信號量。
代碼:


namespace LoginBase
{
    public class Register
    {
        XmppClientConnection _connection;
        static AutoResetEvent myResetEvent;
        public bool IsUsed;
        public Register()
        {

            _connection = new XmppClientConnection();
            _connection.SocketConnectionType = agsXMPP.net.SocketConnectionType.Direct;
            _connection.OnLogin += new ObjectHandler(XmppCon_OnLogin);
            _connection.OnRegisterError += new OnXmppErrorHandler(XmppCon_OnRegErr);
            _connection.OnRegistered += new ObjectHandler(XmppCon_OnRegistered);

        }
        public bool IsSuccessfull = false;
        public void RegisterJab(string username, string password, string server)
        {

            _connection.Server = server;
            _connection.Username = username;
            _connection.Password = password;
            _connection.Port = 80;
            _connection.UseSSL = false;
            _connection.AutoResolveConnectServer = true;
            _connection.ConnectServer = null;
            _connection.SocketConnectionType = agsXMPP.net.SocketConnectionType.Direct;
            _connection.UseStartTLS = true;
            _connection.RegisterAccount = true;
            myResetEvent = new AutoResetEvent(false);
            _connection.Open();
            myResetEvent.WaitOne(20 * 1000, true);
            _connection.Close();

        }
        private void XmppCon_OnRegistered(object sender)
        {
            IsSuccessfull = true;
            myResetEvent.Set();
        }

        private void XmppCon_OnLogin(object sender)
        {
            IsSuccessfull = true;
            myResetEvent.Set();


        }
        private void XmppCon_OnRegErr(object sender, Element e)
        {
            //errCode如果是409則已經(jīng)存在用戶
            IsSuccessfull = false;
            Element xn = e.SelectSingleElement("error");
            if (xn.Attribute("code") == "409")
                IsUsed = true;
            myResetEvent.Set();

        }


    }

}


    先設(shè)置為非終止?fàn)顟B(tài),然后進(jìn)入Jabber線程,阻塞Asp線程,并且等待,超時時間為20秒。如果觸發(fā)了回調(diào)事件,則設(shè)置狀態(tài)為終止,asp線程繼續(xù)執(zhí)行。
    成功完成同步,這樣一來,必須等到Jabber輔助線程執(zhí)行完,Asp線程才會繼續(xù)下去。

http://m.survivalescaperooms.com/bluewater/archive/2006/08/14/476720.html


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄山市| 吴江市| 巴中市| 鸡西市| 南郑县| 黎城县| 上栗县| 潜山县| 扶绥县| 临泉县| 芮城县| 理塘县| 太仆寺旗| 金川县| 梓潼县| 广元市| 锡林郭勒盟| 苗栗市| 白水县| 万宁市| 泰安市| 奇台县| 武威市| 建昌县| 常宁市| 平果县| 哈巴河县| 寻甸| 宜兰市| 溧水县| 虹口区| 湘阴县| 新疆| 兴宁市| 来宾市| 蒙阴县| 九台市| 增城市| 吴忠市| 庆安县| 宜川县|