이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 2585|회답: 2

[출처] .Net 반응형 확장 기능의 주제를 탐색하세요

[링크 복사]
게시됨 2024. 1. 27. 오후 12:17:19 | | | |
.Net 반응형 확장은 선언적 동작을 사용하여 이벤트 처리를 더 간단하고 표현력 있게 만들 수 있도록 .Net 개발자들이 반응형 프로그래밍 모델을 구현할 수 있는 일련의 기능을 제공합니다. 반응형 스케일링의 핵심 핵심은 IObserver와 IObservable 인터페이스이지만, 개발자로서 직접 구현할 필요가 없는 경우가 많습니다. 라이브러리<T>는 인터페이스를 구현하고 다양한 기능을 지원하는 내장 타입인 Subject를 지원합니다.

테마는 라이브러리에서 제공되는 다양한 주제의 기반이며, ReplaySubject<T>, BehaviorSubject,<T> AsyncSubject 등 다른 주제들도 있습니다<T>. 이 두 요소들의 본질적인 차이점과 라이브러리를 더 잘 활용하는 방법을 이해하는 것이 유용합니다.

이 글에서는 피실험체<T>와 그 형제를 비교하여 그들의 행동 차이를 설명하고자 합니다.

제목<T>

앞서 언급했듯이, Subject<T>는 사용 가능한 테마의 기반으로, IObservable<T>과 IObserver 인터페이스를 직접 구현하지 않고도 라이브러리를 쉽게 사용할 수 있는 방법을 제공합니다<T>. 주제 유형의 간단한 시연은 아래에 나와 있습니다.

위 코드에서 Subject 인스턴스를 만들었<T>고,<T> IObserver와 IObserverable을 구현하기 때문에 <T>동일한 인스턴스를 사용해 IObserver에 값을 구독하고 게시합니다. 여기서 또 하나 중요한 점은 Subscribe 메서드의 과부하를 사용해 액션을 입력으로 받아들이는 방식입니다. 이 작업은 각 공개된 값에 대해 수행되며, 이 경우 콘솔에 숫자를 출력합니다.

다음 이미지에서 공개된 값들과 IObserver(이 액션에서 )가 콘솔에 출력하는 값을 보여보겠습니다<T>. 이렇게 하면 남은 형제자매들과 변종을 쉽게 비교할 수 있습니다.



첫 번째 줄은 공개된 값을 나타내며, 두 번째 줄은 IObserver가 받은 값을 나타냅니다. 또한, 실행 중 관찰자가 스트림에 가입하는 시점을 나타내는 줄을 추가했습니다. 이 선은 세로 점선으로 표현됩니다.

위 코드에서 관찰자가 첫 값을 게시하기 전에 데이터 스트림에 구독한 것을 확인했습니다. 이미지는 첫 번째 요소 앞에 있는 가입자 라인을 보여줍니다. 출력 라인에서 보시다시피, 이 시점에서는 출력에 아무런 영향을 주지 않습니다.

하지만 관찰자가 이미 일부 값이 공개된 후에야 데이터를 구독한다면 어떻게 될까요? 이것이 관찰자들이 받는 데이터에 영향을 미치나요? 출력을 보기 전에 먼저 같은 코드를 작성해 봅시다.

위 코드에서 관찰자는 두 값(1과 2)이 공개된 후에만 데이터 스트림에 가입하는 것을 관찰할 수 있습니다. 예상할 수 있듯이, 이로 인해 관측자들은 구독 방식을 호출하기 전에 공개된 데이터를 받지 못하게 됩니다. 아래 그림에서 볼 수 있듯이.



관찰자가 늦게 구독하더라도 모든 공개된 값을 읽고 싶다면? 이때 ReplaySubject<T>가 등장합니다.

재재생 주제<T>

ReplaySubject<T>는 값을 캐시하여 이후 구독자를 위해 재생합니다. 이는 경주 조건을 피하는 데 유용합니다. 이전 코드를 ReplaySubject로 변경<T>해 관찰자가 받는 결과에 어떤 영향을 미치는지 살펴보겠습니다.

위 코드에서 보듯이, 코드<T><T>에 거의 변화가 없지만 이제 Subject 대신 ReplaySubject를 사용한다는 점만 다릅니다. 다음 도표는 관찰자가 받은 데이터에 미치는 영향을 보여줍니다.



이미지에서 보듯이, 캐시된 값은 가입자가 나중에 가입하더라도 다시 재생됩니다. 물론, 이 유용한 기능에는 대가가 따릅니다. 이 구현은 구독자가 발행한 모든 값을 캐시하므로, 데이터 양이 크게 많을 때 메모리 문제가 발생할 수 있습니다.

하지만 ReplaySubject는<T> 이 문제를 해결할 수 있는 여러 방법을 가지고 있습니다. 이 예시를 위해, 캐시 값을 제한하기 위해 크기와 시간 제약을 사용하는 두 가지 예시를 살펴보겠습니다.

첫 번째 경우는 캐시 크기를 이용해 캐시 값을 제한합니다. <T>ReplaySubject의 생성자는 캐시 버퍼 크기(최대 요소 수)를 나타내는 정수를 받아들이는 오버로드를 제공합니다. 예시에서 코드를 변경해 캐시 크기를 1로 제한해 봅시다.

<T>ReplaySubject의 구성자 과부하를 사용해 캐시 크기를 1로 제공하는 방식을 주목하세요. 이로 인해 캐싱이 제한되고, 한 요소만 캐시되어 게시되는 즉시 새 요소로 교체됩니다. 이 변화의 영향은 아래에 나와 있습니다.



캐싱을 제한하는 또 다른 방법은 캐시된 항목의 사용 시간을 제한하는 것, 즉 캐시된 항목의 만료 시간을 제공하는 것입니다.

그 예를 설명할 코드를 작성해 봅시다.

이전 코드와 유사하게,<T> 우리는 ReplaySubject 생성자의 과부하를 사용해 캐시 내 아이템의 만료 시간을 지정합니다. 우리의 사례를 보여주기 위해 값 공개 사이에 지연을 도입했습니다.

관찰자가 구독하기까지 1200ms가 걸리므로, 1000ms 만료 시간을 초과하는 요소는 캐시에서 제거됩니다. 이 예시에서는 값 1이 캐시에서 제거되어 늦은 구독자에게 재생되지 않습니다. 아래 그림에서 볼 수 있듯이.



<T>ReplaySubject를 위한 다른 오버로드도 있어 더 유연하고 캐시 값을 세밀하게 조정할 수 있지만, 예시는 위에서 이미 다룬 두 가지 예시를 유지하겠습니다.

행동 대상자<T>

BehaviourSubject<T>는 ReplaySubject와 매우 유사하게<T> 캐시 값을 저장하는 데 도움을 줍니다. 하지만 중요한 차이가 있습니다. BehaviourSubject<T>는 마지막으로 공개된 값만 캐시합니다. 더 깊이 들어가기 전에, 코드를 작성해 보겠습니다.

BehaviorSubject가<T> 단 하나의 값만 캐시한다면(마지막으로 알려진 값), 크기가 1인 ReplaySubject와 어떻게 다른<T>가요? 다음 도표는 위 코드의 상황을 명확히 반영합니다.



하지만 이것이 완전히 사실은 아닙니다. 여기서 이해해야 할 두 가지 중요한 차이점이 있습니다. 첫 번째는 디폴트의 존재입니다. 위 코드에서 <T>BehaviourSubject 구성자에 기본값으로 0을 제공한다는 점에 유의하세요. 캐시에 값이 없거나(즉, 관찰자가 구독하기 전에 데이터가 공개되지 않았다면) 기본 값이 반환됩니다. 이는 크기가 1인 ReplaySubject와 다릅니다. ReplaySubject<T>는 아무런 값이 없습니다. 다음 코드와 시퀀스의 시각적 표현이 이 동작을 보여줍니다.



두 번째 차이점은<T> BehaviorSubject와 ReplaySubject<T>가 완료된 시퀀스를 구독할 때 어떻게 동작하는지입니다. 구독을 완료하면 <T> 아래 코드에 나와 같이 BehaviorSubject의 가치가 없습니다.

구독자는 구독이 완료된 후에 이루어지기 때문에 어떠한 가치를 받지 못할 것이 보장됩니다.



하지만 <T>ReplaySubject는 이 점이 다릅니다. 아래 코드에서 보듯이 관찰자가 어떤 값도 받지 못한다는 보장은 없습니다.

위 코드에서 보듯이, 캐시 크기는 1이며, 호출이 완료된 후 구독이 호출되더라도 캐시는 유지됩니다(만료 조건이 충족될 때까지). 따라서 이 경우 마지막으로 공개된 값이 수신됩니다.



비동기 주체<T>

AsyncSubject<T>는 이 글에서 탐구할 주제의 마지막 형제이며<T>, 이전 두 가지(ReplaySubject와 BehaviourSubject)와 매우 유사하여 결과를 캐시합니다. 하지만 다시 말하지만, 중요한 차이가 있습니다. AsyncSubject는 시퀀스가 완료로 표시된 경우에만 마지막 캐시 값을 공개합니다 <T> (마지막 값 하나만 캐시합니다).

다음 코드를 생각해 보십시오.

이 값은 관찰자에게 해당 시퀀스가 완료 전 마지막으로 발표된 값으로 표시되는 값 4를 생성합니다. 아래 그림에서 볼 수 있듯이.



그런데 시퀀스가 완료된 것으로 표시하는 호출을 건너뛰면 어떻게 될까요? 줄을 댓글로 빼고 다시 시도해 봅시다.

이는 AsyncSubject가 시<T>퀀스가 완료된 후에만 결과를 게시하기 때문에 관찰자에게 데이터를 생성하지 않습니다.



이 점은 AsyncSubject를 사용하는 누구나 반드시 염두에 두어야 할 중요한 차이점<T>입니다.

결론

이 글은 <T>Subject의 여러 형제자매 간의 차이점과 그 변형들을 보여줍니다. 이러한 미묘한 차이를 인지하는 것이 종종 유용한데, 만약 인지하지 못하면 예상과 다른 행동을 보일 수 있기 때문입니다.

원본 링크:하이퍼링크 로그인이 보입니다.





이전의:.NET/C#은 TCP 포트가 사용 가능한지 확인합니다
다음:NSIS (1) 간단한 설치 프로그램 만들기
 집주인| 게시됨 2024. 1. 27. 오후 12:19:47 |
Angular RxJS의 주제별 구독
https://www.itsvse.com/thread-9209-1-1.html
 집주인| 게시됨 2024. 4. 28. 오전 11:36:59 |
ASP.NET 코어는 MediatR 중개 모델을 사용합니다
https://www.itsvse.com/thread-9272-1-1.html
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com