欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rx.NET庫(kù)中IDisposable對(duì)象的用法

 更新時(shí)間:2022年07月01日 10:52:03   作者:天方  
這篇文章介紹了Rx.NET庫(kù)中IDisposable對(duì)象的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

IDisposable是.net中的主動(dòng)資源釋放接口,它是在編程過(guò)程中經(jīng)常使用到的一個(gè)接口,本文介紹一下微軟在Rx.NET中提供的一系列常用的Disposable類,通過(guò)它們可以簡(jiǎn)化我們的程序代碼,提高代碼質(zhì)量。

IDisposable:

一個(gè)簡(jiǎn)單的IDisposable接口實(shí)現(xiàn)如下

class DisposableObject : IDisposable
{
    private readonly string name = null;
 
    public DisposableObject(string name)
    {
        this.name = name;
    }
 
    public void Dispose()
    {
        Console.WriteLine("{0} - Disposed", this.name);
    }
}

注: 這個(gè)例子并不是合適的實(shí)現(xiàn),主要是為了后面的代碼演示使用。

ICancelable

RX框架在Disposable接口上擴(kuò)展了一下,增加了一個(gè)查看是否被釋放的狀態(tài),定義了一個(gè)ICancelable接口

public interface ICancelable : IDisposable
{
    bool IsDisposed { get; }
}

除了Disposable.Empty外,RX框架提供的都是ICancelable接口對(duì)象。

Disposable.Empty

Disposable.Empty返回的是一個(gè)沒(méi)有任何功能的IDisposable對(duì)象,是一個(gè)IDisposable的NullObject模式的實(shí)現(xiàn)。

它的Dispose函數(shù)可以使用,但沒(méi)有任何行為。

Disposable.Create

Disposable.Create可以快速構(gòu)建一個(gè)IDisposable對(duì)象,它接受一個(gè)委托,當(dāng)Dispose函數(shù)調(diào)用時(shí),執(zhí)行該委托。

var d = Disposable.Create(() =>
{
    Console.WriteLine("Disposed");
});
d.Dispose();

BooleanDisposable

BooleanDisposable是一個(gè)簡(jiǎn)單的ICancelable的實(shí)現(xiàn),它的Dispose操作也沒(méi)有任何行為,但可以查看該函數(shù)是否執(zhí)行過(guò)。

var d = new BooleanDisposable();
Console.WriteLine(d.IsDisposed);

d.Dispose(); 
Console.WriteLine(d.IsDisposed);

由于不能控制該對(duì)象的Dispose行為,這個(gè)對(duì)象用得到不是很多,往往用來(lái)作為一個(gè)開(kāi)關(guān)變量使用。

CancellationDisposable

CancellationDisposable可將一個(gè)CancellationTokenSource對(duì)象封裝為Disposable對(duì)象

  • 當(dāng)Dispose函數(shù)調(diào)用時(shí),調(diào)用Cancel函數(shù)。
  • 查看IsPosed狀態(tài)時(shí),返回IsCancellationRequested狀態(tài)

簡(jiǎn)單的示例如下:

var source = new CancellationTokenSource();
source.Token.Register(() => Console.WriteLine("Cancelled"));
var d = new CancellationDisposable(source);
Console.WriteLine(d.IsDisposed);
Console.WriteLine(source.IsCancellationRequested);

RefCountDisposable

RefCountDisposable也是一個(gè)封裝型的Disposable對(duì)象,不過(guò)它是一個(gè)引用計(jì)數(shù)型的封裝。

  • 新建RefCountDisposable對(duì)象后,引用計(jì)數(shù)為1
  • 調(diào)用GetDisposable可以生成一個(gè)新的引用Disposable封裝,引用技術(shù)加1
  • 調(diào)用RefCountDisposable對(duì)象和GetDisposable生成的Disposable對(duì)象時(shí),引用計(jì)數(shù)都減1
  • 引用計(jì)數(shù)為0時(shí),釋放封裝的Disposable對(duì)象

這里需要注意的時(shí),當(dāng)調(diào)用RefCountDisposable. Dispose函數(shù)時(shí),可能引用計(jì)數(shù)還不為0,此時(shí)還是可以繼續(xù)調(diào)用GetDisposable函數(shù)增加引用計(jì)數(shù)的。

簡(jiǎn)單的示例如下:

var d    = new RefCountDisposable(new DisposableObject("#1"));
var ref1 = d.GetDisposable();
var ref2 = d.GetDisposable();
Console.WriteLine("ref2 - Dispose");
ref2.Dispose();
Console.WriteLine("ref1 - Dispose");
ref1.Dispose();
Console.WriteLine("Dispose");
d.Dispose();

這個(gè)類在釋放共享資源的時(shí)候非常有用,例如我們做視頻點(diǎn)播的時(shí)候,當(dāng)有多個(gè)客戶端點(diǎn)播視頻時(shí),每個(gè)客戶端都需要維護(hù)引用計(jì)數(shù),當(dāng)所有客戶端都退出的時(shí)候,會(huì)自動(dòng)Dispose,注銷視頻源。

CompositeDisposable

CompositeDisposable用于聚合多個(gè)disposable對(duì)象,形成一個(gè)新的disposable對(duì)象,它主要有Add,Clear,Dispose三個(gè)函數(shù)。

  • Add函數(shù)將子Disposable對(duì)象添加到集合
  • Clear函數(shù)刪除集合類所有的Disposable對(duì)象,同時(shí)調(diào)用子Disposable對(duì)象的Dispose函數(shù)
  • Dispose函數(shù)釋放CompositeDisposable對(duì)象:釋放所有子Disposable對(duì)象。
  • 如果CompositeDisposable對(duì)象已經(jīng)釋放,再次調(diào)用Add函數(shù)時(shí),不會(huì)添加到集合,而是直接調(diào)用其子對(duì)象的Dispose函數(shù)。

簡(jiǎn)單的示例如下:

var d = new CompositeDisposable();
d.Add(new DisposableObject("#1"));
d.Add(new DisposableObject("#2"));
d.Add(new DisposableObject("#3"));
d.Clear();
Console.WriteLine("----------");
d.Add(new DisposableObject("#4"));
d.Add(new DisposableObject("#5"));
d.Add(new DisposableObject("#6"));
d.Dispose();
Console.WriteLine("----------");
d.Add(new DisposableObject("#7"));

ContextDisposable

ContextDisposable對(duì)象也是一個(gè)復(fù)合Disposable對(duì)象

  • 它主要用于封裝一個(gè)Disposable對(duì)象,將其與一個(gè)SynchronizationContext上下文關(guān)聯(lián),
  • 封裝后生成的ContextDisposable對(duì)象的Disposable函數(shù)會(huì)Post到上下文線程中執(zhí)行。

簡(jiǎn)單的示例如下:

var context = SynchronizationContext.Current;
var obj     = new DisposableObject("#1");
var d       = new ContextDisposable(context, obj);
d.Dispose();

這個(gè)對(duì)象用于釋放UI對(duì)象非常方便,另外,也可以實(shí)現(xiàn)用于將一些Dispose函數(shù)推送到指定的隊(duì)列中串行執(zhí)行,從而避免一些并發(fā)問(wèn)題。

ScheduledDisposable

ScheduledDisposable和ContextDisposable類似,也是用于封裝一個(gè)Disposable對(duì)象,不過(guò)它是將其Dispose函數(shù)推送到指定的IScheduler中執(zhí)行。

var scheduler = ThreadPoolScheduler.Instance;
var obj       = new DisposableObject("#1");
var d         = new ScheduledDisposable(scheduler, obj);
d.Dispose();

SingleAssignmentDisposable

SingleAssignmentDisposable是一個(gè)關(guān)聯(lián)型的Disposable對(duì)象

  • 可以通過(guò)它的Disposable屬性關(guān)聯(lián)到子Dispose對(duì)象。
  • 當(dāng)執(zhí)行Dispose函數(shù)時(shí),執(zhí)行的是子Dispose對(duì)象的Dispose函數(shù),如果沒(méi)有關(guān)聯(lián)子Dispose對(duì)象,則不執(zhí)行任何操作。
  • 已經(jīng)執(zhí)行Dispose函數(shù)后,再次使用Disposable屬性關(guān)聯(lián)后無(wú)法關(guān)聯(lián),直接會(huì)調(diào)用子對(duì)象的Dispose函數(shù)。

SingleAssignmentDisposable的關(guān)聯(lián)有一個(gè)Single特點(diǎn),它主要體現(xiàn)為:

  • 如果已經(jīng)通過(guò)Disposable屬性關(guān)聯(lián)后,再次調(diào)用Disposable屬性關(guān)聯(lián)時(shí)會(huì)拋異常

簡(jiǎn)單的示例如下:

var d = new SingleAssignmentDisposable();
d.Disposable = new DisposableObject("#1");
try
{
    d.Disposable = new DisposableObject("#2"); //--- 例外発生
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message);
}
d.Dispose();
d.Disposable = new DisposableObject("#3");

輸出結(jié)果為:

Disposable has already been assigned.
#1 – Disposed
#3 - Disposed

MultipleAssignmentDisposable

MultipleAssignmentDisposable和SingleAssignmentDisposable類似,區(qū)別是其關(guān)聯(lián)的multi特性,它的特點(diǎn)是:

  • 如果已經(jīng)通過(guò)Disposable屬性關(guān)聯(lián)后,再次調(diào)用Disposable屬性是會(huì)覆蓋關(guān)聯(lián)

簡(jiǎn)單的示例如下:

var d = new MultipleAssignmentDisposable();
d.Disposable = new DisposableObject("#1");
d.Disposable = new DisposableObject("#2");
d.Dispose();
d.Disposable = new DisposableObject("#3");

輸出結(jié)果為:

#2 – Disposed
#3 - Disposed

SerialDisposable

SerialDisposable和SingleAssignmentDisposable也類似,不過(guò)它的Disposable屬性再次關(guān)聯(lián)的策略是:

  • 覆蓋關(guān)聯(lián),同時(shí)先釋放上一個(gè)Disposable對(duì)象。

簡(jiǎn)單的示例如下:

var d = new SerialDisposable();
Console.WriteLine("#1 - Set");
d.Disposable = new DisposableObject("#1");
Console.WriteLine("#2 - Set");
d.Disposable = new DisposableObject("#2");
Console.WriteLine("Dispose");
d.Dispose();

輸出結(jié)果為:

#1 – Set
#2 – Set
#1 – Disposed
Dispose
#2 – Disposed
#3 – Set
#3 - Disposed

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實(shí)現(xiàn)HTTP協(xié)議迷你服務(wù)器(兩種方法)

    C#實(shí)現(xiàn)HTTP協(xié)議迷你服務(wù)器(兩種方法)

    用C#語(yǔ)言實(shí)現(xiàn)HTTP協(xié)議的服務(wù)器類本文將以兩種稍微有差別的方式用C#語(yǔ)言實(shí)現(xiàn);要完成高性能的Web服務(wù)功能,通常都是需要寫入到服務(wù),如IIS,Apache Tomcat感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)c#有所幫助
    2013-02-02
  • ASP.NET中獲取URL重寫前的原始地址詳解

    ASP.NET中獲取URL重寫前的原始地址詳解

    在ASP.NET中,如果你使用了URL重寫,通過(guò)HttpContext.Request獲取到的是重寫后的地址。如果這個(gè)地址要返回給客戶端(比如Redirect),我們一般希望是重寫前的友好地址。
    2013-07-07
  • 異步 HttpContext.Current實(shí)現(xiàn)取值的方法(解決異步Application,Session,Cache...等失效的問(wèn)題)

    異步 HttpContext.Current實(shí)現(xiàn)取值的方法(解決異步Application,Session,Cache.

    在一個(gè)項(xiàng)目中,為了系統(tǒng)執(zhí)行效率更快,把一個(gè)經(jīng)常用到的數(shù)據(jù)庫(kù)表通過(guò)dataset放到Application中,發(fā)現(xiàn)在異步實(shí)現(xiàn)中每一次都會(huì)出現(xiàn)HttpContext.Current為null的異常,后來(lái)在網(wǎng)上查了好多資料,發(fā)現(xiàn)問(wèn)這個(gè)問(wèn)題的人多,回答的少
    2009-07-07
  • C#中發(fā)送郵件代碼

    C#中發(fā)送郵件代碼

    最近學(xué)習(xí)了下C#中實(shí)現(xiàn)郵件發(fā)送功能,并將該功能用于本博客的密碼找回中!
    2008-11-11
  • asp.net MVC實(shí)現(xiàn)無(wú)組件上傳圖片實(shí)例介紹

    asp.net MVC實(shí)現(xiàn)無(wú)組件上傳圖片實(shí)例介紹

    無(wú)組件實(shí)現(xiàn)上傳圖片使用input的file作為上傳選擇文件,具體實(shí)現(xiàn)如下:前后臺(tái)代碼很詳細(xì),感興趣的朋友們可不要錯(cuò)過(guò)了哈
    2013-05-05
  • ASP.NET Core3.x API版本控制的實(shí)現(xiàn)

    ASP.NET Core3.x API版本控制的實(shí)現(xiàn)

    這篇文章主要介紹了ASP.NET Core3.x API版本控制的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • ASP.NET中Form表單不可以嵌套使用

    ASP.NET中Form表單不可以嵌套使用

    這篇文章主要介紹了ASP.NET中Form表單不可以嵌套使用的情況,需要的朋友可以參考下
    2015-10-10
  • ASP.NET Core靜態(tài)文件使用教程(9)

    ASP.NET Core靜態(tài)文件使用教程(9)

    這篇文章主要為大家詳細(xì)介紹了ASP.NET Core靜態(tài)文件的使用教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • ASP.NET中Web.config文件的層次關(guān)系詳細(xì)介紹

    ASP.NET中Web.config文件的層次關(guān)系詳細(xì)介紹

    Web.config 是一個(gè)基于 XML 的配置文件,該文件的作用是對(duì)應(yīng)用程序進(jìn)行配置,下面為大家介紹下ASP.NET中Web.config文件的層次關(guān)系
    2014-01-01
  • ADO.NET之連接池技術(shù)的使用詳解

    ADO.NET之連接池技術(shù)的使用詳解

    本篇文章是對(duì)連接池技術(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06

最新評(píng)論