Método TValue> Observable.Defer<
Retorna uma sequência observável que invoca a fábrica observável sempre que um novo observador assina.
Namespace:System.Reactive.Linq
Assembly: System.Reactive (em System.Reactive.dll)
Sintaxe
'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.
Parâmetros de tipo
- TValue
O tipo do valor.
Parâmetros
- observableFactory
Tipo: System.Func<IObservable<TValue>>
A função de fábrica observável a ser invocada para cada observador que assina a sequência resultante.
Valor Retornado
Tipo: System.IObservable<TValue>
A sequência observável cujos observadores disparam uma invocação da função de fábrica observável fornecida.
Comentários
O operador Defer permite adiar ou atrasar a criação da sequência até o momento em que um observador assina a sequência. Isso é útil para permitir que um observador obtenha facilmente uma versão atualizada ou de atualizações da sequência.
Exemplos
Este exemplo demonstra o operador Defer criando uma sequência observável de informações do produto usadas por uma empresa ou consumidor. A sequência observável fornece acesso aos níveis de inventário atuais. Ao criar uma sequência observável adiada, o aplicativo pode ter os níveis de inventário atualizados enviados por push para o aplicativo simplesmente assinando novamente a sequência observável.
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;
}
}
}
}
Veja a seguir a saída de exemplo do código de exemplo.
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...