国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

WCF中通過(guò)Dispose有效實(shí)現(xiàn)重用

開(kāi)發(fā) 后端
本文將介紹在WCF中通過(guò)Dispose有效實(shí)現(xiàn)重用,該方法較使用using語(yǔ)句更加安全有效。

本文將詳細(xì)介紹釋放客戶端資源(其中包括端口、通道)和關(guān)閉連接的問(wèn)題。毫無(wú)疑問(wèn),在.NET Framework中,一個(gè)資源(尤其是非托管資源)通常都需要實(shí)現(xiàn)IDisposable接口。一旦實(shí)現(xiàn)了該接口,我們就可以使用using語(yǔ)句來(lái)管理資源,這是最便捷的方式。但是,一旦在using語(yǔ)句中拋出了異常,就可能不會(huì)正確完成資源的回收,尤其是連接,很可能會(huì)一直打開(kāi),既占用了通道和端口,還可能出現(xiàn)資源的浪費(fèi),從而影響系統(tǒng)的性能和穩(wěn)定性。

微軟推薦的***實(shí)踐是拋棄using語(yǔ)句,轉(zhuǎn)而利用 try/catch(/finally)語(yǔ)句。它要求在try語(yǔ)句中調(diào)用Close()方法,而在catch中調(diào)用Abort()方法。在新聞中已經(jīng)說(shuō)明了Close()與Abort()方法的區(qū)別,即后者可以強(qiáng)制地關(guān)閉客戶端,包括關(guān)閉客戶端連接,釋放資源。由于Close()方法可能會(huì)拋出 CommunicationException和TimeoutException異常,通常的客戶端代碼應(yīng)該是這樣:

var myClient = new MyClient();
try
{
    //其他代碼
    myClient.Close();
}
catch (CommunicationException)
{
    myClient.Abort();
}
catch (TimeoutException)
{
    myClient.Abort();
}
catch (Exception)
{
    myClient.Abort();
    throw;
}

在***增加對(duì)Exception異常的捕獲很有必要,因?yàn)槲覀儾恢繡lose()方法會(huì)否拋出某些不可預(yù)知的異常,例如 OutOfMemoryException等。新聞中提到Steve Smith的方法其實(shí)就是對(duì)這段冗長(zhǎng)代碼的封裝,封裝方式是采用擴(kuò)展方法,擴(kuò)展的類型為ICommunicationObject。這是因?yàn)樗械目蛻舳藢?duì)象都實(shí)現(xiàn)了ICommunicationObject接口。

以下是Steve Smith的擴(kuò)展方法代碼:

public static class Extensions
{
    public static void CloseConnection(this ICommunicationObject myServiceClient)
    {
        if (myServiceClient.State != CommunicationState.Opened)
        {
            return;
        }
        try
        {
            myServiceClient.Close();
        }
        catch (CommunicationException ex)
        {
            Debug.Print(ex.ToString());
            myServiceClient.Abort();
        }
        catch (TimeoutException ex)
        {
            Debug.Print(ex.ToString());
            myServiceClient.Abort();
        }
        catch (Exception ex)
        {
            Debug.Print(ex.ToString());
            myServiceClient.Abort();
            throw;
        }
    }
}

利用該擴(kuò)展方法,在本應(yīng)調(diào)用Close()方法的地方,代替為CloseConnection()方法,就可以避免寫(xiě)冗長(zhǎng)的catch代碼。而使用 Lambda表達(dá)式的方式可以說(shuō)是獨(dú)辟蹊徑,使用起來(lái)與using語(yǔ)法大致接近。實(shí)現(xiàn)方法是定義一個(gè)靜態(tài)方法,并接受一個(gè) ICommunicationObject對(duì)象與Action委托:


public class Util
{
    public static void Using(T client, Action action)
        where T : ICommunicationObject
    {
        try
        {
            action(client);
            client.Close();
        }
        catch (CommunicationException)
        {
            client.Abort();
        }
        catch (TimeoutException)
        {
            client.Abort();
        }
        catch (Exception)
        {
            client.Abort();
            throw;
        }
    }
}

使用時(shí),可以將原本的客戶端代碼作為Action委托的Lambda表達(dá)式傳遞給Using方法中:


Util.Using(new MyClient(), client =>
    {
        client.SomeWCFOperation();
        //其他代碼;
    });

還有一種方法是定義一個(gè)自己的ChannelFactory,讓其實(shí)現(xiàn)IDisposable接口,并作為ChannelFactory的Wrapper 類。在該類中定義Close()和Dispose()方法時(shí),考慮到異常拋出的情況,并在異常拋出時(shí)調(diào)用Abort()方法。這樣我們就可以在using 中使用自定義的ChannelFactory類。例如:


public class MyChannelFactory:IDisposable
{
    private ChannelFactory m_innerFactory;
    public MyChannelFactory(ChannelFactory factory)
    {
        m_innerFactory = factory;
    }
    ~MyChannelFactory()
    {
        Dispose(false);
    }
    public void Close()
    {
        Close(TimeSpan.FromSeconds(10));
    }
    public void Close(TimeSpan span)
    {
        if (m_innerFactory != null)
        {
            if (m_innerFactory.State != CommunicationState.Opened)
            {
                return;
            }
            try
            {
                m_innerFactory.Close(span);
            }
            catch (CommunicationException)
            {
                m_innerFactory.Abort();
            }
            catch (TimeOutException)
            {
                m_innerFactory.Abort();
            }
            catch (Exception)
            {
                m_innerFactory.Abort();
                throw;
            }
        }
    }
    private void Dispose(booling disposing)
    {
        if (disposing)
        {
            Close();
        }
    }
    void IDisposable.Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

其實(shí)采用代理模式的方式與此實(shí)現(xiàn)相同。總之,萬(wàn)變不離其宗,所有替代方案的設(shè)計(jì)本質(zhì)都是對(duì)冗長(zhǎng)的try/catch/finally的一次包裝,從而有效地實(shí)現(xiàn)重用,保證系統(tǒng)的安全、性能與穩(wěn)定性。

【編輯推薦】

  1. 淺析.NET中的Server push技術(shù)
  2. .NET動(dòng)靜結(jié)合編程 接口和委托的約束強(qiáng)度
  3. 使用.NET Array類的Sort方法分類數(shù)值
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-12-21 16:04:45

WCF Dispose

2010-02-22 14:09:08

WCF Dispose

2009-12-21 17:48:30

WCF方法重載

2012-04-20 10:05:16

WCF

2010-06-09 09:15:58

JSF 2Ajax組件

2010-01-06 09:17:57

軟件重用

2009-09-07 09:36:29

C# DisposeDispose方法

2009-12-21 14:58:57

WCF用戶密碼認(rèn)證

2011-03-29 09:14:49

Dispose模式C#

2010-02-24 12:49:39

WCF枚舉

2009-12-21 10:00:46

WCF基礎(chǔ)開(kāi)發(fā)

2010-02-25 13:35:27

WCF tcpTrac

2013-12-04 14:19:40

JavaScript代碼重用

2023-09-28 11:42:15

2011-03-15 16:07:33

Windows AzuWCF

2010-02-22 14:28:35

WCF實(shí)現(xiàn)loadin

2009-11-09 14:02:31

WCF傳輸數(shù)據(jù)

2009-12-08 15:06:33

WCF傳輸DataSe

2011-10-27 16:24:48

API
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久久国产视频91| 老熟妇仑乱视频一区二区| 国产精品网站在线看| 亚洲第一精品久久忘忧草社区| 99久热re在线精彩视频| 26uuu亚洲综合色欧美| 日韩电影免费观看高清完整| 亚洲精品91| 国产精品久久久久高潮| 日韩中文在线| 伊人久久久久久久久久久| 人人超在线公开视频| 欧美在线三级电影| 国产污污在线观看| 亚洲激情自拍视频| 猫咪av永久| 亚洲美女免费视频| 好吊妞这里只有精品| 中文字幕精品一区二区三区精品| 亚洲一区二区三区免费看| 717成人午夜免费福利电影| 国产精品第一第二| 一区二区三区高清在线观看| 国产亚洲成精品久久| 免费看男女www网站入口在线| 欧美一区二区久久| 日本在线视频网| 欧美一区二区三区男人的天堂| 国产小视频免费在线观看| 婷婷一区二区三区| 在线国产日本| 色婷婷综合久久久| 成人午夜电影在线观看| 欧美午夜视频网站| 成a人片在线观看| 精品国产精品网麻豆系列| av日韩国产| 国产小视频91| 123成人网| 欧美日韩国产999| 日韩成人在线电影| 欧美黑人极品猛少妇色xxxxx| 99精品在免费线中文字幕网站一区| 欧美精品在线免费播放| 亚洲区小说区| 51国偷自产一区二区三区的来源| 欧美日韩伊人| 一级全黄肉体裸体全过程| 成人免费看黄yyy456| 国产一级片黄色| 性做久久久久久久久| 国产二区视频在线观看| 精品国产露脸精彩对白| 婷婷成人av| 国产精品午夜国产小视频| 精久久久久久| 丁香色欲久久久久久综合网| 久久亚洲一级片| 免费羞羞视频网站| 91久久精品一区二区三区| 日本中文字幕视频在线| 亚洲区一区二区| 日韩欧美国产大片| 久久综合九色欧美狠狠| 国产成人午夜视频| 天堂中文字幕——hd| 欧美大片一区二区| 北条麻妃在线一区二区免费播放| 99三级在线| av电影一区二区| 伊人中文字幕在线| 亚洲欧美精品中文字幕在线| 噜噜噜天天躁狠狠躁夜夜精品| 7777精品久久久大香线蕉小说| 日本不卡一区二区三区高清视频| 国产亚洲欧美在线视频| 午夜精品久久久久久久久久| 亚洲区欧洲区| 66m—66摸成人免费视频| 99在线|亚洲一区二区| 免费av手机在线观看| 舔着乳尖日韩一区| 成人性生交大片免费网站| 欧美一级大片视频| 亚洲专区在线| 8848hh四虎| 精品视频在线播放| 日韩理论在线| 国产a级片网站| 91福利在线播放| 欧美欧美在线| 日本在线播放一区| 亚洲午夜电影网| 国精产品一区二区三区有限公司| 国产精品久久久久久av下载红粉 | 亚洲成人一区在线| 黄色在线观看www| 国产精品永久免费观看| 国产成人av资源| 成人亚洲综合天堂| 欧美最猛性xxxx| 国产精品香蕉一区二区三区| 欧美男男同志| 欧美一级bbbbb性bbbb喷潮片| 蜜臀av性久久久久蜜臀av麻豆| 中文天堂av| 欧美夫妻性生活视频| 国产剧情av麻豆香蕉精品| yjizz视频网站在线播放| 国产精品福利在线| 国产精品久久久久久久久免费桃花 | 在线黄色免费观看| 亚洲欧美色图片| 国产日韩亚洲欧美精品| 宅男午夜在线| 欧美在线国产精品| 91色在线porny| 成人欧美一区二区三区的电影| 老牛影视免费一区二区| 日韩欧美亚洲综合| 欧美变态挠脚心| 亚洲国产精品久久久久婷蜜芽| 欧美tk—视频vk| 日韩精品每日更新| 日韩影视在线| 亚洲成人a**址| 日韩免费一区二区| 久久综合图片| 天堂av最新在线| 水蜜桃亚洲一二三四在线| 欧美美女视频在线观看| 国内精品99| 成人激情电影在线看| av资源一区二区| 色婷婷久久久久swag精品| 99久久综合狠狠综合久久aⅴ| 黄动漫视频高清在线| 国产精品美女999| 天天色 色综合| 欧美精品黄色| 黄色精品免费看| 亚洲精品久久区二区三区蜜桃臀| 精品久久久久久久久久久院品网| 性欧美xxxx大乳国产app| 国产丝袜在线| 日韩欧美在线一区二区| 日韩欧美色综合网站| 美女mm1313爽爽久久久蜜臀| 黄色软件视频在线观看| 300部国产真实乱| 在线观看亚洲区| 久久久精品国产99久久精品芒果| 欧美二区观看| 国产呻吟对白刺激无套视频在线| 91亚色免费| 欧美精品一区男女天堂| 国产一区91精品张津瑜| 日本午夜免费一区二区| 一区二区xxx| 国产中文欧美精品| 欧美高清激情brazzers| 久久99精品国产91久久来源| www.色在线| 久久综合久久色| 国产精品盗摄久久久| 91搞黄在线观看| 久久成人精品无人区| 少妇精品视频在线观看| 午夜爽爽爽男女免费观看影院| 成人a在线观看| 日韩午夜三级在线| 91性感美女视频| 日韩欧美三级| av资源中文在线| 日韩一级理论片| 99r国产精品视频| 亚洲小视频在线| 亚洲美女屁股眼交3| aa国产精品| 国产情侣一区在线| 亚洲网友自拍| 99久久久精品视频| 国产成人欧美在线观看| 日韩午夜激情免费电影| 久久精品欧美一区二区三区麻豆 | 久久亚洲影院| 国产精品白丝久久av网站| 伊人春色在线| avove在线观看| 日韩免费不卡av| 亚洲精品第一国产综合精品| 国产视频亚洲色图| 国产精品亚洲欧美| www.成人网| 岛国成人毛片| 成人au免费视频影院| 日韩经典在线视频| 国产精品扒开腿做爽爽爽视频| 亚洲黄色av女优在线观看| 一区二区三区视频在线观看|