2017-10-22 3 views
0

Minio에서 작동하는 C# .net 코어 ListObjectsAsync example이 있는데, 콘솔에 게시하는 대신 목록에 결과를 캡처하는 방법은 무엇입니까?observable.Subscribe 함수에서 문자열 목록을 얻으려면 어떻게합니까

using System; 
using Minio.DataModel; 

namespace Minio.Examples.Cases 
{ 

    class ListObjects 
    { 
     // List objects matching optional prefix in a specified bucket. 
     public static void Run(Minio.MinioClient minio, 
            string bucketName = "my-bucket-name", 
            string prefix = null, 
            bool recursive = false) 
     { 
      try 
      { 
       Console.Out.WriteLine("Running example for API: ListObjectsAsync"); 
       IObservable<Item> observable = minio.ListObjectsAsync(bucketName, prefix, recursive); 

       IDisposable subscription = observable.Subscribe(
        item => Console.WriteLine("Object: {0}", item.Key), 
        ex => Console.WriteLine("OnError: {0}", ex), 
        () => Console.WriteLine("Listed all objects in bucket " + bucketName + "\n")); 

       // subscription.Dispose(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("[Bucket] Exception: {0}", e); 
      } 
     } 
    } 
} 

나는이 목록에 이름을 추가하는 대신 콘솔로 인쇄 할 수 있도록 기능을 구독 수정 시도 :

IDisposable subscription = observable.Subscribe(
item => names.Add(item.Key), 
ex => Console.WriteLine("OnError: {0}", ex), 
() => Console.WriteLine("Listed all objects in bucket " 
+ bucketName + "\n" + "count:" + names.Count +"\n")); 

는 7 인쇄,하지만 외부 names.Count를 인쇄하는 경우 of 그것을 구독하십시오 0; 그 불가능 있도록으로 IDisposable을

List<Item> myList = new List<Item>(observable.ToList().Subscribe(x => Console.WriteLine("do something"), 
    ex => Console.WriteLine("OnError: {0}", ex), 
() => Console.WriteLine("Done" + "\n")); 

그러나 관찰 결과 :

이것은 내가 원하는 무엇입니까. 관측 가능 목록에서 목록으로 이동하려면 어떻게해야합니까? 또는 asp.net 핵심보기로 전달할 수 있도록 데이터를 수집하는 방법은 무엇입니까?

이 기능은 - svek 제안처럼 대기를 사용합니다. 내가 익숙해 나는 것보다 읽는 조금 더 열심히 코드를 찾을 수 있지만 waiting IObservable to get all elements error

List<Item> names = new List<Item>(); 

IDisposable subscription = observable.ToList().Subscribe(
    x => names.AddRange(x), 
    ex => Console.WriteLine("OnError: {0}", ex), 
() => Console.WriteLine("Done" + "\n")); 
observable.Wait(); 
Console.WriteLine("out of subscribe count:" + names.Count + "\n"); 
subscription.Dispose(); 
return names; 
+0

또한'observable.ToList()를 할 수 있습니다.'T') 0 개 이상의 요소를 하나의'IList의 를'(생산에 0 개 이상의 생산에서 관찰 변경하는'(구독합니다. – Enigmativity

+0

을 내가 사용하는 경우 ToList() 데이터는 여전히 내부 관찰 기능의 "덫"입니다. 내가 둘다있어 데이터? 또는 단어 그에게 어쩌면 올바른 방법을 포함하는 목록 얻는 방법을 어떻게 감시 오브젝트로 변환 할 목록 에?'.ToList을 시도 –

+0

(). 대기()'. 그것은 (당신이 물어 않았다) 차단 호출,하지만 당신이 정말로'.Subscribe을 (사용해야으로 즉, 그러나, 적합하지 않습니다. ..)'. – Enigmativity

답변

2

: 나는이 글을 읽을 때까지 구문을 인식하지 않았다. 당신의 화제에 관해서, 어떻게 내가 observable.Subscribe 함수에서 문자열 목록을받을 수 있나요코드 자체는

당신이 시도 및 인쇄 names.Count 가능성이 때 0을 받고 이유는 유효합니다 Observable <T>.Subscribe() 메서드의 비동기 작업이 완료 될 때까지 기다리지 않기 때문입니다.

이 예를 참조하면 코드의 구문을 이해하는 데 도움이 :

IObservable<int> source = Observable.Range(1, 10); 
IObserver<int> observer = Observer.Create<int>(
    x => Console.WriteLine("OnNext: {0}", x), 
    ex => Console.WriteLine("OnError: {0}", ex.Message), 
    () => Console.WriteLine("OnCompleted"));   
IDisposable subscription = source.Subscribe(observer); 

Console.WriteLine("Press ENTER to unsubscribe..."); 
Console.ReadLine(); 
subscription.Dispose(); 

위의 리팩토링의 뜻을 : 그래서 같은 Observer 유형을 사용하도록 다시 작성할 수 있습니다

IObservable<int> source = Observable.Range(1, 10); 
IDisposable subscription = source.Subscribe(
    x => Console.WriteLine("OnNext: {0}", x), 
    ex => Console.WriteLine("OnError: {0}", ex.Message), 
    () => Console.WriteLine("OnCompleted")); 

Console.WriteLine("Press ENTER to unsubscribe..."); 
Console.ReadLine(); 
subscription.Dispose(); 

해결 방법을 훨씬 더 명확히하는 데 도움이됩니다. 보시다시피 첫 번째 코드 블록에서 사용 된 매개 변수는 실제로 Observer.Create<T>() 메서드를 호출합니다.

Observer.Create Method

은 다음과 같습니다

// OnCompleted 
() => Console.WriteLine("Listed all objects in bucket " 
      + bucketName + "\n" + "count:" + names.Count +"\n")); 

를 순서가 작업을 수행하기 전에 완료 될 때까지 제대로 기다리고 있기 때문에 : 사용할 때이 제대로 카운트를 반환 이유

public static IObserver<T> Create<T>(
    Action<T> onNext, 
    Action<Exception> onError, 
    Action onCompleted 
) 

즉 콘솔에 메시지를 표시하는 것.

문제를 해결하려면 비동기 Subscribe 작업이 열거되기 전에 먼저 완료해야합니다.


참고 : 위의
코드 예제는 MSDN에서 찍은 및 here를 찾을 수 있습니다.

+0

어디서 기다려야할까요? 노력하고 있는게 없어요. 관찰 할 수있는 것을 포함해서. 목록(). 구독하고 관찰 할 수 있습니다. –

+0

@MattLengenfelder - 다른 질문을 게시 한 다음 댓글에 링크를 공유 하시겠습니까? 나는이 대답이 현시대로 아주 길다는 것을 두려워한다. 그렇지 않으면,'Observer' 패턴을 구현하는 방법을 읽을 수 있습니다. 위의 두 번째 리팩토링 된 코드 블록을 참고하십시오. – Svek

+0

나는 그것이 일하고있어, 고마워! 나는 단지 관찰 할 수있는 것을 추가 할 필요가 있었다. 잠깐(); 나는 대기 구문을 몰랐다() names.count를 인쇄하기 전에, 나는 대기 observable.subscribe 및 작동하지 않았다 다른 일을 시도 유지하지만, obeservable.wait는() 작동합니다. –