如何从 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