如何从 ShowDialog 返回 IObservable<DialogResult>

Posted

技术标签:

【中文标题】如何从 ShowDialog 返回 IObservable<DialogResult>【英文标题】:How to return an IObservable<DialogResult> from ShowDialog 【发布时间】: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 工作时使用它。编写异步代码不应该是一个目标,而是解决特定问题的一种手段。 【参考方案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。这样做仍然会阻塞线程、资源等。

以上是关于如何从 ShowDialog 返回 IObservable<DialogResult>的主要内容,如果未能解决你的问题,请参考以下文章

ShowDialog()的返回值设定为DialogResult.OK

PrintDialog.ShowDialog(this) 在 Windows 7 上立即返回 DialogResult.Cancel

从 TabControl 拖动时出现表单 ShowDialog 问题

如何使用 Form.ShowDialog?

使用 ShowDialog() 时如何使用打开的表单?

如何配置 ShowDialog?