西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)其它知識(shí) → WCF編程中需要及時(shí)關(guān)閉的案例分享

WCF編程中需要及時(shí)關(guān)閉的案例分享

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2011/4/24 7:57:26字體大。A-A+

作者:西西點(diǎn)擊:138次評(píng)論:2次標(biāo)簽: WCF

手機(jī)QQ2017 for Androidv6.6.9 官方最新版
  • 類型:社交聊天大。37.8M語言:中文 評(píng)分:8.0
  • 標(biāo)簽:
立即下載

剛學(xué)WCF的時(shí)候沒發(fā)現(xiàn)這個(gè)問題,調(diào)得很愉快卻沒有發(fā)現(xiàn)其實(shí)“暗藏殺機(jī)”,可謂危險(xiǎn)重重,還好后來覺得是有些不妥,于是google“WCF需要關(guān)閉嗎”,立馬找到了幾個(gè)博客園的鏈接,進(jìn)去一看,各位大俠均紛紛表示“關(guān)是一定要關(guān)的,但是你還不能用完就關(guān),因?yàn)殛P(guān)了,就不能再打開了,還得New,可以New的成本又有一點(diǎn)高”,好吧,這么說來就只有好好規(guī)劃一下了。

  那么什么時(shí)候該關(guān)呢,答案是異常了的時(shí)候,MSDN給出了代碼(錯(cuò)誤處理部分,找不到鏈接了,見諒)

 

      catch (CommunicationException)
            {
                client.Abort();
            }
            catch (TimeoutException)
            {
                clent.Abort();
            }

 所以這樣一來,就有了解決方案,那就是在每一處需要調(diào)用Wcf和代碼里加上try catch,大概就成了如下這樣

UserClient client = new UserClient();
try
{
client.Create(new User(){
     UserName="xian",
     Password="123"});
}

catch (CommunicationException)
{
   client.Abort();
}
catch (TimeoutException)
{
   clent.Abort();
}

   這樣挺好的,沒錯(cuò),不過我們總不可能只調(diào)用一個(gè)Wcf接口吧,我們要調(diào)的可是一系列,也就是若干接口,那么就我們就需要寫很多重復(fù)的錯(cuò)誤處理代碼塊了。這樣原來沒什么問題,而且是理所當(dāng)然的事情?墒俏矣浀媚澄焕哮B說過當(dāng)代碼出現(xiàn)很大程度重復(fù)的時(shí)候你就該重構(gòu)它了(也是在博客園看到了,很普通但深入人心的道理),并且為了讓代碼好看一點(diǎn),我們還是想想好點(diǎn)的辦法。

如果你有些經(jīng)驗(yàn),肯定馬上就去想到使用委托來實(shí)現(xiàn)消除代碼的冗余,是的,下面就是我這次的實(shí)現(xiàn)方式,代碼如下: 

ServiceInvokeHelper調(diào)用輔助類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Helper
{
    /// <summary>
    /// Wcf服務(wù)調(diào)用輔助類
    /// </summary
    public static class ServiceInvokeHelper<TChannel> where TChannel : ICommunicationObject, new()
    {
        #region private fields
        private static Dictionary<string, TChannel> _ChannelDic = new Dictionary<string, TChannel>();
        private static object _Lockhelper = new object();

        private static TResult TryFunc<TResult>(Func<TChannel, TResult> func, TChannel channel)
        {
            string tChannelName = typeof(TChannel).FullName;
            try
            {
                return func(channel);
            }
            catch (CommunicationException)
            {
                channel.Abort();
                lock (_Lockhelper)
                    _ChannelDic.Remove(tChannelName);
                throw;
            }
            catch (TimeoutException)
            {
                channel.Abort();
                lock (_Lockhelper)
                    _ChannelDic.Remove(tChannelName);
                throw;
            }
            catch (Exception)
            {
                channel.Abort();
                lock (_Lockhelper)
                    _ChannelDic.Remove(tChannelName);
                throw;
            }
      }

        private static TChannel GetChannel()
        {
            TChannel instance;
            string tChannelName = typeof(TChannel).FullName;
            if (!_ChannelDic.ContainsKey(tChannelName))
            {
                lock (_Lockhelper)
                {
                    instance = Activator.CreateInstance<TChannel>();
                    _ChannelDic.Add(tChannelName, instance);
                }
            }
            else
            {
                instance = _ChannelDic[tChannelName];
            }
            if (instance.State != CommunicationState.Opened && instance.State != CommunicationState.Opening)
                instance.Open();
            return instance;
        }

        /// <summary>
        /// 直接調(diào)用,無返回值
        /// </summary>
        public static void Invoke(Action<TChannel> action)
        {
            TChannel instance = GetChannel();
            TryFunc(
                client =>
                {
                    action(client);
                    return (object)null;
                }
                , instance);
        }
        /// <summary>
        /// 有返回值的調(diào)用
        /// </summary>
        public static TResult Invoke<TResult>(Func<TChannel, TResult> func)
        {
            TChannel instance = GetChannel();
            ICommunicationObject channel = instance as ICommunicationObject;
            TResult returnValue = default(TResult);
            returnValue = TryFunc(func, instance);
            return returnValue;
        }
      }
}

  有了以上代碼,我們就可以這樣調(diào)Wcf了

ServiceInvokeHelper<UserClient>.Invoke(client=>client.Create({new User{
    UserName="xian";
    Password="123";
}}));

  測試過程中發(fā)現(xiàn)這樣不支持out 和ref參數(shù)的調(diào)用,比如這樣是不可以的

public void GetUserList(int pageindex,int pagesize,ref count)
{
     return ServiceInvokeHelper<UserClient>.Invoke(client=>client.GetUserList(pageindex,pagesize,ref count));
}

  但是我們可以變通成如下模樣

public void GetUserList(int pageindex,int pagesize,ref count)
{
    return ServiceInvokeHelper<UserClient>.Invoke(client=>

   {

    int tmpCount = -1;

    client.GetUserList(pageindex,pagesize,ref tmpCount));

    count = tmpCount;

  }
}

  是不是方便許多,并且也不但心因?yàn)殛P(guān)閉不及時(shí)造成連接數(shù)到達(dá)上限的情況,看起來不起眼的一個(gè)東西就分享到這時(shí),感謝你的閱讀!

    寂寞交友
    (73)寂寞交友
    寂寞交友由西西為大家整理一系列火熱的社交應(yīng)用,因?yàn)榧拍挥眩S著時(shí)代的發(fā)展,人們?cè)絹碓綗o法滿足現(xiàn)有的交際圈子,對(duì)于擇偶標(biāo)準(zhǔn)的提高,催生出一系列單身男女的情感問題,壓抑的情緒需要得到一定的釋放,如果你想找尋屬于自己的緣分,就趕快下載吧。交友軟件排行微信企鵝之子的基數(shù)之巨大,寂寞的時(shí)候搖一搖,絲男也會(huì)有春天不過企鵝之子也有個(gè)弊病,依托于的用戶資源,環(huán)肥燕瘦難以保證。來往來往是拼爹的,背靠大樹好乘涼。...更多>>
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • 陌陌安卓版7.5.1 官方正式版

      01-13 / 55.7M

      推薦理由:陌陌安卓版是類似于微信的一款基于真實(shí)地理位置的交友工具你可以通過陌陌認(rèn)識(shí)周圍的陌生人或者朋友,免費(fèi)發(fā)
    • 陌陌電腦版v0.2.1 官方最新版

      07-22 / 47.9M

      推薦理由:大家都知道陌陌吧,現(xiàn)在西西軟件園給大家提供一款電腦版本的陌陌哦。即使你沒有智能手機(jī),也能玩陌陌~您可以
    • 來往電腦版v6.1.0 官方版

      10-12 / 21.8M

      推薦理由:來往推出來也有一段時(shí)間了,西西一直在默默關(guān)注這款社交軟件的發(fā)展,從推廣的力度來看,來往這款軟件毋庸置
    • 來往安卓版6.6.5 官方最新版

      07-19 / 24.6M

      推薦理由:使用來往應(yīng)用端輕松對(duì)好友分組,輕松與自己的小圈子分享有趣的時(shí)刻。在來往,不用擔(dān)心你的媽媽會(huì)看到你與朋
    • 點(diǎn)點(diǎn)蟲(閱后即焚)6.8.2官網(wǎng)安卓版

      01-23 / 23.3M

      推薦理由:點(diǎn)點(diǎn)蟲app是一款閱后即焚聊天應(yīng)用,最大限度的保障了用戶的個(gè)人隱私,你可以在此發(fā)瀉心中的不滿及各類情緒,
    生活分享
    (13)生活分享
    生活分享系列是由西西為大家整理,當(dāng)前的各類軟件都是服務(wù)于我們的生活,只是著重點(diǎn)不同,有聊天有美食有娛樂有旅行,西西特地為大家準(zhǔn)備了一些日常生活中常用的小工具,相信能在平時(shí)的日常生活中用到,讓我們能更好的品味生活。生活小妙招巧用牙膏若有小面積皮膚損傷或燒傷燙傷,抹上少許牙膏,可立即止血止痛,也可防止感染,療效頗佳。巧除紗窗油膩可將洗衣粉吸煙剩下的煙頭一起放在水里,待溶解后,拿來擦玻璃窗紗窗,效果均不...更多>>
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • 網(wǎng)易云音樂電腦版V2.1.2.168028 官

      01-01 / 30.7M

      推薦理由:網(wǎng)易云音樂手機(jī)版上線半年之際,PC版也要和大家見面啦!網(wǎng)易云音樂是一款專注于發(fā)現(xiàn)與分享的音樂產(chǎn)品,網(wǎng)易云
    • 網(wǎng)易云音樂3.8.1 安卓版

      01-29 / 22.4M

      推薦理由:華少【中國好聲音主持人】——只有在網(wǎng)易云音樂,我的身份才是音樂DJ,與你聊聊我心中的好聲音。王東【著名
    • 知乎日?qǐng)?bào)電腦版v2.5.2 官方pc版

      06-15 / 5.0M

      推薦理由:知乎日?qǐng)?bào)是知乎每日精選出一些全網(wǎng)最值得看的內(nèi)容整合產(chǎn)物,知乎日?qǐng)?bào)以獨(dú)有的方式為你提供最高質(zhì)、最深度、
    • 知乎日?qǐng)?bào)v2.6.2 安卓版

      01-22 / 11.4M

      推薦理由:知乎最近貌似越來越活躍了,先是出了個(gè)知乎客戶端現(xiàn)在又來個(gè)知乎日?qǐng)?bào),大概是想吸引更多的用戶吧。用最熱的
    • 網(wǎng)易公開課安卓版4.5.0 官方最新版

      02-07 / 17.3M

      推薦理由:網(wǎng)易公開課安卓版,全球知名院校的高級(jí)教授公開課,免費(fèi)觀看,最大最全的課程平臺(tái),國內(nèi)外頂尖學(xué)府的海量名
    2015最受歡迎APP
    (27)2015最受歡迎APP
    中國最受歡迎榜單發(fā)布,西西第一時(shí)間為用戶推出最受歡迎排行榜專區(qū)下載,在這里你可以下載到中國最受歡迎的,在整個(gè)市場,實(shí)際上仍舊是占領(lǐng)主導(dǎo)地位。中國最受歡迎榜單前分別是微信手機(jī)淘寶搜狗輸入法瀏覽器支付寶錢包瀏覽器愛奇藝今日頭條百度地圖酷狗音樂大眾點(diǎn)評(píng)滴滴出行等等。整個(gè)市場可以分成三大類第一類是移動(dòng)社交移動(dòng)出行手機(jī)地圖移動(dòng)購物等領(lǐng)域已經(jīng)是大局已定。微信移動(dòng)社交,以及快的滴滴手機(jī)地圖手機(jī)淘寶移動(dòng)商城等領(lǐng)域...更多>>
    • 微信2016 Android 版v6.3.31.920谷

      11-21 / 38.8M

      推薦理由:基于Android平臺(tái)的騰訊微信服務(wù),帶給您全新的移動(dòng)即時(shí)通信體驗(yàn)。您可以使用微信軟件快速地發(fā)送消息,即時(shí)拍
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • 搜狗手機(jī)輸入法 For Android8.7 官

      12-21 / 20.8M

      推薦理由:Android智能手機(jī)在國內(nèi)已經(jīng)正在被越來越多的人所接受。作為智能平臺(tái)第三方輸入法必不可少,搜狗手機(jī)輸入法持
    • UC瀏覽器安卓手機(jī)版V11.4.0.921 官

      02-20 / 18.0M

      推薦理由:UC瀏覽器是一款全球領(lǐng)先的智能手機(jī)瀏覽器,擁有獨(dú)創(chuàng)的U3內(nèi)核和云端技術(shù),完美地支持HTML5應(yīng)用,具有智能、極
    • 淘寶網(wǎng)客戶端 Android版v6.4.2 官方

      01-26 / 63.8M

      推薦理由:淘寶Android手機(jī)客戶端是淘寶網(wǎng)官方推出的提供給用戶使用的手機(jī)購物軟件,為用戶提供快捷方便的手機(jī)購物新體
    • 支付寶錢包V10.0.3.021302 安卓版

      02-13 / 52.4M

      推薦理由:支付寶錢包是支付寶針對(duì)手機(jī)推出的客戶端軟件,用戶可通過它用手機(jī)登陸支付寶。只要在您的手機(jī)上安裝了支付
    00后最常用的app
    (29)00后最常用的app
    西西軟件園為用戶帶來后手機(jī)必備軟件大全,最常用的手機(jī)下載,一次性搞定這些熱門的社交軟件和游戲,讓你的生活更加精彩,下面看下部分軟件介紹社交軟件手機(jī),手機(jī)移動(dòng)版提供多媒體溝通服務(wù),方便用戶在移動(dòng)設(shè)備上通過語音圖片視頻等方式輕松交流。致力于更完美的移動(dòng)社交娛樂與生活體驗(yàn)樂在溝通年,聊天歡樂億人微信,微信,數(shù)億人使用,能通過手機(jī)網(wǎng)絡(luò)給好友發(fā)送語音文字消息表情圖片和視頻,還可分享照片到朋友圈。通過搖一搖查...更多>>
    qq2016
    (11)qq2016
    每年年初騰訊都會(huì)發(fā)布當(dāng)年最新版的,正是騰訊官方發(fā)布的正式版。雖然從版開始就不再以年號(hào)明明而是以版本,不過用戶還是習(xí)慣的年號(hào)版本。最新版的因?yàn)閯倓偘l(fā)布肯定是有一些細(xì)節(jié)上的問題的,不過大家可以體驗(yàn)到新版的功能特性也是很不錯(cuò)的,如果你喜歡折騰可以來西西下載版,這里西西給大家提供了最新的電腦版下載及手機(jī)版下載。...更多>>
    • qq2016體驗(yàn)版8.6.18733 官方最新版

      08-18 / 56.0M

      推薦理由:QQ2014正式版5.1去廣告版1.破解登陸限制2.破解會(huì)員體驗(yàn)限制3.破解寬度限制4.去除了多余廣告5.去QQ安全中心破
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • QQ輕聊版for windowsv7.9(14305) 官

      12-02 / 46.5M

      推薦理由:QQ輕聊版for windows是騰訊為pc端客戶推出的一款精簡版qq,用過手機(jī)qq輕聊版的用戶對(duì)輕聊版應(yīng)該都有個(gè)大概的
    • QQ20178.9.20026 官方最新版

      02-08 / 60.2M

      推薦理由:qq2017最新版官方下載,QQ2017全新設(shè)計(jì)回歸本源設(shè)計(jì),讓您的目光停留在您所關(guān)注的內(nèi)容上,大大提升了溝通的
    • QQ2016輕聊版3.5.0 官網(wǎng)安卓版

      06-28 / 10.5M

      推薦理由:QQ2014輕聊版是騰訊公司專為低性能手機(jī)打造的精簡版QQ。保留核心聊天功能,超小安裝包,省內(nèi)存,聊天更暢快
    • 騰訊qq2015正式版7.7.16077 官方最

      02-14 / 52.4M

      推薦理由:騰訊這次又爽約了,說好的QQ2014呢,好吧,今晚,終于迎來了傳說中的QQ2014,騰訊推送了一個(gè)QQ5.0的首個(gè)體驗(yàn)

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(2)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)