Observable.Defer<TValue> メソッド
新しいオブザーバーがサブスクライブするたびに、監視可能なファクトリを呼び出す監視可能なシーケンスを返します。
Namespace:System.Reactive.Linq
アセンブリ: System.Reactive (System.Reactive.dll)
構文
'Declaration
Public Shared Function Defer(Of TValue) ( _
observableFactory As Func(Of IObservable(Of TValue)) _
) As IObservable(Of TValue)
'Usage
Dim observableFactory As Func(Of IObservable(Of TValue))
Dim returnValue As IObservable(Of TValue)
returnValue = Observable.Defer(observableFactory)
public static IObservable<TValue> Defer<TValue>(
Func<IObservable<TValue>> observableFactory
)
public:
generic<typename TValue>
static IObservable<TValue>^ Defer(
Func<IObservable<TValue>^>^ observableFactory
)
static member Defer :
observableFactory:Func<IObservable<'TValue>> -> IObservable<'TValue>
JScript does not support generic types and methods.
型パラメーター
- TValue
値の型。
パラメーター
- observableFactory
型: System.Func<IObservable<TValue>>
結果のシーケンスをサブスクライブする各オブザーバーに対して呼び出す監視可能なファクトリ関数。
戻り値
型: System.IObservable<TValue>
オブザーバーが特定の監視可能ファクトリ関数の呼び出しをトリガーする監視可能なシーケンス。
解説
Defer 演算子を使用すると、オブザーバーがシーケンスをサブスクライブするまで、シーケンスの作成を延期または遅延できます。 これは、オブザーバーが更新または更新されたバージョンのシーケンスを簡単に取得できるようにするために役立ちます。
例
この例では、ビジネスまたはコンシューマーが使用する製品情報の監視可能なシーケンスを作成することで、Defer オペレーターを示します。 監視可能なシーケンスは、現在のインベントリ レベルへのアクセスを提供します。 遅延監視可能シーケンスを作成することで、アプリケーションは、監視可能なシーケンスを再サブスクライブするだけで、更新されたインベントリ レベルをアプリケーションにプッシュできます。
using System;
using System.Reactive.Linq;
namespace Example
{
class Program
{
static void Main()
{
//*****************************************************************************************************//
//*** Product inventories change from time to time. This example demonstrates the Defer operator ***//
//*** by creating an observable sequence of the Product class. The creation of the sequence is ***//
//*** deferred until the observer calls Subscribe and a new observable sequence is always generated ***//
//*** at that time with the latest inventory levels to be sent to the observer. ***//
//*****************************************************************************************************//
ProductInventory myInventory = new ProductInventory();
IObservable<Product> productObservable = Observable.Defer(myInventory.GetUpdatedInventory);
//******************************************************//
//*** Generate a simple table in the console window. ***//
//******************************************************//
Console.WriteLine("Current Inventory...\n");
Console.WriteLine("\n{0,-13} {1,-37} {2,-18}", "Product Name", "Product ID", "Current Inventory");
Console.WriteLine("{0,-13} {1,-37} {2,-18}", "============", "====================================",
"=================");
//**********************************************************************************//
//*** Each product in the sequence will be reported in the table using the ***//
//*** Observer's OnNext handler provided with the Subscribe method. ***//
//**********************************************************************************//
productObservable.Subscribe(prod => Console.WriteLine(prod.ToString()));
//******************************************************************************************************//
//*** To get the updated sequence from the deferred observable all we have to do is subscribe again. ***//
//******************************************************************************************************//
Console.WriteLine("\n\nThe updated current Inventory...\n");
Console.WriteLine("\n{0,-13} {1,-37} {2,-18}", "Product Name", "Product ID", "Current Inventory");
Console.WriteLine("{0,-13} {1,-37} {2,-18}", "============", "====================================",
"=================");
productObservable.Subscribe(prod => Console.WriteLine(prod.ToString()));
Console.WriteLine("\nPress ENTER to exit...\n");
Console.ReadLine();
}
//**************************************************************************************************//
//*** ***//
//*** The Product class holds current product inventory information and includes the ability for ***//
//*** each product to display its information to the console window. ***//
//*** ***//
//**************************************************************************************************//
class Product
{
private readonly string productName;
private readonly string productID;
private int currentInventory;
public Product(string name, int inventory)
{
productName = name;
productID = Guid.NewGuid().ToString();
currentInventory = inventory;
}
public void RemoveInventory(int delta)
{
currentInventory -= delta;
if (currentInventory < 0)
currentInventory = 0;
}
public override string ToString()
{
return String.Format("{0,-13} {1,-37} {2,-18}", productName, productID, currentInventory);
}
}
//*****************************************************************************************************//
//*** ***//
//*** The ProductInventory class initializes all our product information and provides an Observable ***//
//*** sequence of the product inventories through the GetUpdatedInventory() method. This method ***//
//*** is provided to our call to Observable.Defer() so that all subscriptions against the deferred ***//
//*** observable get the lastest inventory information whenever Subscribe is called. ***//
//*** ***//
//*****************************************************************************************************//
class ProductInventory
{
private Product[] products = new Product[5];
private Random random = new Random();
public ProductInventory()
{
for (int i = 0; i < 5; i++)
{
//*************************************************************//
//*** Initial inventories will be a random count under 1000 ***//
//*************************************************************//
products[i] = new Product("Product " + (i + 1).ToString(), random.Next(1000));
}
}
public IObservable<Product> GetUpdatedInventory()
{
//***************************************************************************************************//
//*** When inventory for each product is updated up to 50 of each product is consumed or shipped. ***//
//***************************************************************************************************//
for (int i = 0; i < 5; i++)
products[i].RemoveInventory(random.Next(51));
//****************************************************************************************************//
//*** This updated observable sequence is always provided by this method when Subscribe is called. ***//
//****************************************************************************************************//
IObservable<Product> updatedProductSequence = products.ToObservable();
return updatedProductSequence;
}
}
}
}
コード例からの出力例を次に示します。
Current Inventory...
Product Name Product ID Current Inventory
============ ==================================== =================
Product 1 04e76657-c403-4208-a300-a3ba42fbe218 808
Product 2 3bc7f823-6624-4803-b673-ec2e7d8802b7 114
Product 3 1e5755f3-6301-4faa-8e1b-35765dc73bce 2
Product 4 f691ddef-b679-42a2-99c7-83651fbf1cc5 894
Product 5 df1f331b-8a52-4a54-a2fb-63d69dda6c1a 467
The updated current Inventory...
Product Name Product ID Current Inventory
============ ==================================== =================
Product 1 04e76657-c403-4208-a300-a3ba42fbe218 761
Product 2 3bc7f823-6624-4803-b673-ec2e7d8802b7 81
Product 3 1e5755f3-6301-4faa-8e1b-35765dc73bce 0
Product 4 f691ddef-b679-42a2-99c7-83651fbf1cc5 890
Product 5 df1f331b-8a52-4a54-a2fb-63d69dda6c1a 440
Press ENTER to exit...