最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rx.NET庫中IDisposable對象的用法

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

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

IDisposable:

一個簡單的IDisposable接口實現(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);
    }
}

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

ICancelable

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

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

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

Disposable.Empty

Disposable.Empty返回的是一個沒有任何功能的IDisposable對象,是一個IDisposable的NullObject模式的實現(xiàn)。

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

Disposable.Create

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

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

BooleanDisposable

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

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

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

由于不能控制該對象的Dispose行為,這個對象用得到不是很多,往往用來作為一個開關變量使用。

CancellationDisposable

CancellationDisposable可將一個CancellationTokenSource對象封裝為Disposable對象

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

簡單的示例如下:

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也是一個封裝型的Disposable對象,不過它是一個引用計數(shù)型的封裝。

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

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

簡單的示例如下:

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();

這個類在釋放共享資源的時候非常有用,例如我們做視頻點播的時候,當有多個客戶端點播視頻時,每個客戶端都需要維護引用計數(shù),當所有客戶端都退出的時候,會自動Dispose,注銷視頻源。

CompositeDisposable

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

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

簡單的示例如下:

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對象也是一個復合Disposable對象

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

簡單的示例如下:

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

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

ScheduledDisposable

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

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

SingleAssignmentDisposable

SingleAssignmentDisposable是一個關聯(lián)型的Disposable對象

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

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

  • 如果已經(jīng)通過Disposable屬性關聯(lián)后,再次調(diào)用Disposable屬性關聯(liá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");

輸出結果為:

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

MultipleAssignmentDisposable

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

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

簡單的示例如下:

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

輸出結果為:

#2 – Disposed
#3 - Disposed

SerialDisposable

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

  • 覆蓋關聯(lián),同時先釋放上一個Disposable對象。

簡單的示例如下:

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();

輸出結果為:

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

灵台县| 收藏| 东丽区| 长寿区| 清水县| 孟津县| 昭苏县| 广安市| 玉山县| 无极县| 丹江口市| 西平县| 磐石市| 东乌| 沙雅县| 阳谷县| 玛曲县| 宿松县| 临夏市| 南皮县| 顺昌县| 怀集县| 澜沧| 方正县| 德庆县| 苏尼特右旗| 福海县| 汝南县| 抚顺县| 徐水县| 孟村| 安溪县| 西丰县| 凤阳县| 故城县| 金寨县| 保德县| 定安县| 龙州县| 峡江县| 五峰|