2016-12-15 3 views
1

에서 IObservable 을 반환하는 방법 : 나는 다음과 같은 서명으로 확장 메서드를 만들 찾고 있어요 ShowDialog를

public static IObservable<DialogResult> ShowDialog(this Form form); 

나는이 작동하도록하는 방법을 모르겠어요. 이것은 내가 지금까지 가지고있는 것입니다 :

Task<DialogResult> task = Task.Factory.StartNew(() => 
{ 
    return form.ShowDialog(); 
}); 
return task.ToObservable(); 

편집 : 멋진, 고마워. 나는이 물건을 좀 더 읽어야한다!

+3

왜이 기능을 원하십니까? UI가 아닌 스레드에서 UI 작업을 수행하면 어떻게 될 것이라고 생각하십니까? –

+0

잘 모르겠습니다. 정말 새로운 기능이고 Reactive Extensions를 사용하여 모든 코드를 비동기 적으로 작성하려고합니다. – potato

+1

하지 마십시오. 감각을 만들 때 비동기 코드 만 실행하십시오. 당신이 그것을 적용해야 할 때 읽고 좋은 방식으로 적용하는 것이 좋습니다. 이것은 실패 할 것입니다. Harse 단어지만 잘 의도 된 조언. 예를 들어 I/O 작업을 수행 할 때 또는 별도의 스레드에서 과도한 CPU 작업을 수행해야하는 경우에 사용하십시오. 비동기 코드 작성은 목표가 아니어야 특정 문제를 해결할 수 있습니다. –

답변

0

필자는이 점을 이해하지 못하더라도이 방법이 효과가있을 것이라고 상상합니다.

public static class Extensions 
{ 
    public static IObservable<DialogResult> ShowDialogObservable(this Form form) 
    { 
     return Observable.Create<DialogResult>(o => 
     { 
      o.OnNext(form.ShowDialog()); 
      return Disposable.Empty; 
     }); 
    } 
} 
+0

감사합니다, 나는 비동기 적으로 DialogResult를 반환하려고합니다. ShowDialog에서 가능할 지 모르겠지만 – potato

+0

@Peter는 여기에 충실한 조언을했습니다. 닫힌 동기식 메서드를 비동기식 메서드로 바꾸는 방법은 없습니다. 'ShowDialog'는 블로킹 (blocking), 동기 (synchronous) 메소드입니다. non-blocking 폼을 원한다면,'Show'를 사용할 것입니다. 이렇게하면 스레드, 리소스 등이 여전히 차단됩니다. – Shlomo