【问题标题】:How to return an IObservable<DialogResult> from ShowDialog如何从 ShowDialog 返回 IObservable<DialogResult>
【发布时间】:2017-04-30 13:39:04
【问题描述】:

我正在寻找具有以下签名的扩展方法:

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

我不知道如何让它工作。这是我目前所拥有的:

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

编辑:很酷,谢谢大家。我真的需要更多地阅读这些东西!

【问题讨论】:

  • 你为什么要这个?如果您在非 UI 线程中进行 UI 工作,您认为会发生什么?
  • 我不知道。我对此真的很陌生,并且正在尝试使用 Reactive Extensions 异步编写所有代码。
  • 请不要。仅在有意义时尝试异步运行代码。您最好阅读何时应该应用它,然后以良好的方式应用它。这注定会失败。粗俗的话,但善意的建议。例如,在执行 I/O 操作或需要在单独的线程上完成繁重的 cpu 工作时使用它。编写异步代码不应该是一个目标,而是解决特定问题的一种手段。

标签: c# winforms system.reactive observable dialogresult


【解决方案1】:

我想这会起作用,尽管我不明白这一点。

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

【讨论】:

  • 谢谢,我正在尝试异步返回 DialogResult,但我不知道 ShowDialog 是否可行
  • @Peter 在这里给出了可靠的建议。没有办法真正将封闭的同步方法转变为异步方法。 ShowDialog 是一种阻塞的同步方法。如果你想要非阻塞形式,你会使用Show。这样做仍然会阻塞线程、资源等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多