Share via


StreamInsight의 IObservable 및 IEnumerable 인터페이스에 대한 추가 정보

이 항목에는 StreamInsight의 Observable 및 열거 가능 이벤트 원본 및 싱크에 대한 지원을 이해하는 데 도움이 되는 자세한 정보가 포함되어 있습니다.

StreamInsight의 IObservable 및 IObserver 인터페이스에 대한 지원

IObservable 및 IObserver 인터페이스 개요

IObservable 인터페이스에서는 다음 메서드를 제공합니다.

메서드

설명

Subscribe

IObserver 인터페이스를 구현하는 구독을 만들고 반환합니다.

IObserver 인터페이스에서는 다음 메서드를 제공합니다.

메서드

설명

OnNext

Observer에게 시퀀스의 새 값을 알립니다.

OnError

Observer에게 예외가 발생하여 시퀀스가 종료되었음을 알립니다.

OnNext, OnCompleted 또는 OnError에 대한 호출은 이 호출 다음에 올 수 없습니다.

OnCompleted

Observer에게 시퀀스 끝을 알립니다.

OnNext, OnCompleted 또는 OnError에 대한 호출은 이 호출 다음에 올 수 없습니다.

Dispose

구독을 삭제합니다.

IObservable 이벤트 원본에서의 입력

Observable 입력에 바인딩된 쿼리를 시작하면 StreamInsight에서 이벤트 원본의 IObservable.Subscribe 메서드를 호출하고, 구독이 만들어지고, 이벤트 원본에서 데이터를 제공하기 시작합니다. 입력은 IObserver.OnCompleted를 호출하여 해당 원본 데이터의 정상 종료를 보고할 수 있습니다. 또는 사용자가 구독을 삭제하여 입력을 중지할 수 있습니다.

예외 및 예외 처리

StreamInsight 쿼리에서 Observable 입력을 사용하면 사용자가 직접 작성한 코드에서 IObservable 또는 IObserver 인터페이스의 메서드를 호출하지 않습니다. StreamInsight에서 사용자에게 적합한 메서드를 호출합니다. 그러나 다음 정보를 참조하면 예외가 발생할 수 있는 경우 및 예외를 처리하는 방법을 이해할 수 있습니다.

입력 어댑터는 이벤트를 제공하는 Observable 이벤트 원본에 대한 참조를 유지 관리합니다.

  • IObservable.Subscribe를 호출할 때 예외가 발생하는 경우 해당 예외가 StreamInsight 런타임으로 전파되고 쿼리가 중단됩니다.

  • IObserver.Dispose를 호출할 때 예외가 발생하는 경우 해당 예외가 기록되고 무시됩니다.

  • IObserver.OnCompleted를 호출하면 입력 어댑터가 해당 어댑터의 중지 사실을 알립니다. 이 호출 다음에 오는 IObserver 메서드에 대한 모든 호출은 오류로 처리되고 예외를 throw할 수 있습니다.

  • IObserver.OnNext를 호출할 때 예외가 발생하면 쿼리가 중단되고 구독이 삭제됩니다. 이 호출 다음에 오는 IObserver 메서드에 대한 모든 호출은 오류로 처리되고 예외를 throw할 수 있습니다. OnNext를 호출할 때 다음 원인으로 인해 예외가 발생할 수 있습니다.

    • Null 이벤트

    • CTI 위반

    • 선택기 식에서 throw된 예외

  • 입력 어댑터의 스트림이 가득 차고 이벤트를 큐에 배치할 수 없는 경우 IObserver.OnNext에 대한 호출이 차단됩니다.

  • IObserver OnError를 호출하면 쿼리가 중단됩니다. 이 호출 다음에 오는 IObserver 메서드에 대한 모든 호출은 오류로 처리되고 예외를 throw할 수 있습니다.

IObservable 이벤트 싱크로의 출력

Observer가 IObservable 출력의 Subscribe 메서드를 호출하여 구독을 만들면 쿼리 인스턴스가 만들어지고 시작되며 일시적 출력에서 데이터를 제공하기 시작합니다. 쿼리 인스턴스는 소비자가 존재하는 동안에만 각 구독에 대해 존재합니다. StreamInsight는 IObserver.OnCompleted를 호출하여 쿼리의 정상 종료를 보고할 수 있습니다. 또는 사용자가 구독을 삭제하여 쿼리를 중지하고 암시적으로 삭제할 수 있습니다. 반대로 일시적 쿼리를 삭제하려면 해당 구독을 먼저 삭제해야 합니다.

예외 및 예외 처리

IObservable 및 IObserver 인터페이스를 통해 StreamInsight 쿼리의 출력을 사용하면 소비자에서 작성한 코드가 이러한 인터페이스의 메서드를 직접 호출합니다. 다음 정보를 참조하면 예외가 발생할 수 있는 경우 및 예외를 처리하는 방법을 이해할 수 있습니다.

스트림이 IObservable 출력으로 변환되면 이 Observable 인스턴스가 원래 스트림에 대한 참조를 유지 관리합니다. 이렇게 하면 Observer가 데이터를 받도록 구독할 수 있습니다.

  • IObservable.Subscribe를 호출하면 쿼리가 만들어지고 시작되며 이벤트를 Observer에게 제공하기 시작합니다. 다음 조건 중 하나가 충족되면 Subscribe에서 예외가 발생할 수 있습니다.

    • 서버가 포함된 서버가 아닙니다.

    • 쿼리를 만들 수 없습니다.

    • 쿼리를 시작할 수 없습니다.

  • IObserver.Dispose를 호출하면 쿼리가 중단된 다음 삭제됩니다. 이러한 구현 때문에 다음 문이 true입니다.

    • Dispose에 대한 호출이 반환된 후 IObserver 메서드에 대한 추가 호출이 수행되지 않습니다.

    • 반드시 Dispose에 대한 호출이 반환되기 전일 필요는 없지만 가능한 한 빨리 기본 쿼리가 중지되고 삭제됩니다.

    • IObserver 메서드에서 Dispose를 호출하면 교착 상태가 발생하지 않습니다.

  • 쿼리가 중단되면 IObserver.OnError가 호출됩니다. 이 구현에서는 적어도 오류에 대한 텍스트 정보가 들어 있는 예외를 제공합니다. OnError를 호출한 후 IObserver 메서드에 대한 추가 호출이 수행되지 않습니다. 다음 조건 중 하나가 충족되면 OnError를 호출할 수 있습니다.

    • 어댑터에서 예외가 발생합니다.

    • 연산자에서 예외가 발생합니다.

  • 쿼리에서 출력 처리를 완료했을 때 IObserver.OnCompleted가 호출됩니다. OnCompleted를 호출한 후 IObserver 메서드에 대한 추가 호출이 수행되지 않습니다. 다음 조건 중 하나가 충족되면 OnCompleted를 호출할 수 있습니다.

    • 출력 어댑터에서 양의 무한대의 CTI를 받습니다.

    • 모든 이벤트가 사용되었기 때문에 쿼리가 일시 중지됩니다.

  • StreamInsight에서 IObserver 메서드를 호출할 때(사용자 코드에 대한 호출) 예외가 발생하는 경우 쿼리가 중단됩니다. 쿼리가 이미 중단되고 있는 경우에는 이 예외가 무시됩니다.

  • 선택기 식에서 예외가 발생하는 경우 쿼리가 중단됩니다.

StreamInsight의 IEnumerable 인터페이스에 대한 지원

IEnumerable 인터페이스 개요

IEnumerable 인터페이스에서는 다음 메서드를 제공합니다.

메서드

설명

GetEnumerator

IEnumerator 인터페이스를 구현하는 열거자를 만들고 반환합니다.

IEnumerator 인터페이스에서는 다음 메서드를 제공합니다.

메서드

설명

Current

현재 요소를 가져옵니다.

MoveNext

열거자를 다음 요소로 이동합니다.

Reset

열거자를 초기 위치로 설정합니다. 이 위치는 첫 번째 요소 앞입니다.

다른 IEnumerator 메서드에 대한 호출은 이 호출 다음에 올 수 없습니다.

Dispose

열거자를 삭제합니다.

IEnumerable 이벤트 원본에서의 입력

일시적 입력에 바인딩된 쿼리를 시작하면 StreamInsight에서 이벤트 원본의 IEnumerable.GetEnumerator 메서드를 호출하고 열거자를 가져옵니다. 그리고 나서 입력 스트림이 비어 있지 않으면 이벤트 원본에서 IEnumerator.MoveNext 및 IEnumerator.Current를 호출하여 데이터를 제공하기 시작합니다. 입력은 StreamInsight에서 MoveNext를 호출할 때 false를 반환하여 해당 원본 데이터의 정상 종료를 보고할 수 있습니다. 또는 사용자가 열거자를 삭제하여 입력을 중지할 수 있습니다.

예외 및 예외 처리

StreamInsight 쿼리에서 열거 가능한 입력을 사용하면 사용자가 직접 작성한 코드에서 IEnumerable 또는 IEnumerator 인터페이스의 메서드를 호출하지 않습니다. StreamInsight에서 사용자에게 적합한 메서드를 호출합니다. 그러나 다음 정보를 참조하면 예외가 발생할 수 있는 경우 및 예외를 처리하는 방법을 이해할 수 있습니다.

입력 어댑터는 이벤트를 끌어올 열거 가능한 이벤트 원본에 대한 참조를 유지 관리합니다. 입력 어댑터가 자체 스레드에서 이벤트 원본을 호출하여 데이터를 가져옵니다.

  • IEnumerable.GetEnumerator, IEnumerator.Current, IEnumerator.MoveNext 또는 IEnumerator.Dispose를 호출할 때 예외가 발생하는 경우 쿼리가 중단됩니다.

  • 선택기 식에서 예외가 발생하는 경우 쿼리가 중단됩니다.

IEnumerable 이벤트 싱크로의 출력

소비자가 IEnumerable 출력의 GetEnumerator 메서드를 호출하여 열거자를 가져오면 쿼리 인스턴스가 만들어지고 시작되며 일시적 출력에서 데이터를 제공하기 시작합니다. 쿼리 인스턴스는 소비자가 존재하는 동안에만 각 열거자에 대해 존재합니다. StreamInsight는 소비자가 IEnumerator.MoveNext를 호출할 때 false를 반환하여 쿼리의 정상 종료를 보고할 수 있습니다. 또는 사용자가 열거자를 삭제하여 쿼리를 중지하고 암시적으로 삭제할 수 있습니다. 반대로 일시적 쿼리를 삭제하려면 해당 열거자를 먼저 삭제해야 합니다.

예외 및 예외 처리

IEnumerable 및 IEnumerator 인터페이스를 통해 StreamInsight 쿼리의 출력을 사용하면 소비자에서 작성한 코드가 이러한 인터페이스의 메서드를 직접 호출합니다. 다음 정보를 참조하면 예외가 발생할 수 있는 경우 및 예외를 처리하는 방법을 이해할 수 있습니다.

스트림이 IEnumerable 출력으로 변환되면 이 열거 가능 인스턴스가 원래 스트림에 대한 참조를 유지 관리합니다. 소비자는 IEnumerable 및 IEnumerator의 메서드를 호출하여 데이터를 끌어옵니다.

  • IEnumerable.GetEnumerator를 호출하면 외부 원본에 값을 제공할 출력 어댑터를 사용하여 쿼리가 만들어집니다. 다음 조건 중 하나가 충족되면 GetEnumerator에서 예외가 발생할 수 있습니다.

    • 서버가 포함된 서버가 아닙니다.

    • 쿼리를 만들 수 없습니다.

    • 어댑터가 없는 경우 등으로 인해 쿼리를 시작할 수 없습니다.

  • IEnumerator.Dispose를 호출하면 쿼리가 중단된 다음 삭제됩니다. 이 구현 때문에 Dispose에 대한 호출이 반환된 후 IEnumerator 메서드에 대한 추가 호출이 수행되지 않습니다. 다음 조건 중 하나가 충족되면 Dispose에서 예외가 발생할 수 있습니다.

    • 쿼리를 중지할 수 없습니다.

    • 쿼리를 삭제할 수 없습니다.

  • MoveNext가 한 번 이상 호출되지 않은 경우 Current 메서드를 호출하면 예외가 발생할 수 있습니다.

  • MoveNext를 호출하는 경우 다음과 같은 상황이 발생합니다.

    • 예외가 발생하지 않습니다.

    • 제공할 데이터가 있으면 true를 반환합니다.

    • 쿼리가 중지되었거나 중단된 경우 false를 반환합니다.

    • 제공할 출력 데이터가 없는 경우 호출이 차단됩니다.