다음을 통해 공유


Observable.Defer<TValue> 메서드

새 관찰자가 구독할 때마다 관찰 가능한 팩터리를 호출하는 관찰 가능한 시퀀스를 반환합니다.

네임스페이스:System.Reactive.Linq
어셈블리: System.Reactive(System.Reactive.dll)

Syntax

'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 연산자를 사용하면 관찰자가 시퀀스를 구독할 때까지 시퀀스 생성을 연기하거나 지연할 수 있습니다. 이는 관찰자가 시퀀스의 업데이트 또는 새로 고침 버전을 쉽게 가져올 수 있도록 하는 데 유용합니다.

예제

이 예제에서는 비즈니스 또는 소비자가 사용하는 제품 정보의 관찰 가능한 시퀀스를 만들어서 연기 연산자를 보여 줍니다. 관찰 가능한 시퀀스는 현재 인벤토리 수준에 대한 액세스를 제공합니다. 지연된 관찰 가능한 시퀀스를 만들면 애플리케이션은 관찰 가능한 시퀀스를 다시 구독하여 업데이트된 인벤토리 수준을 애플리케이션에 푸시할 수 있습니다.

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...

참고 항목

참조

관찰 가능한 클래스

System.Reactive.Linq 네임스페이스