C# 如何返回IObservable<;对话结果>;从ShowDialog

C# 如何返回IObservable<;对话结果>;从ShowDialog,c#,winforms,system.reactive,observable,dialogresult,C#,Winforms,System.reactive,Observable,Dialogresult,我希望创建具有以下签名的扩展方法: public static IObservable<DialogResult> ShowDialog(this Form form); publicstaticiobservable显示对话框(此表单); 我不知道如何让它工作。这就是我到目前为止所做的: Task<DialogResult> task = Task.Factory.StartNew(() => { return form.ShowDialog(); }

我希望创建具有以下签名的扩展方法:

public static IObservable<DialogResult> ShowDialog(this Form form);
publicstaticiobservable显示对话框(此表单);
我不知道如何让它工作。这就是我到目前为止所做的:

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

编辑:很酷,谢谢你们。我真的需要多读一点这方面的东西

我想这是可行的,尽管我不明白这一点

public static class Extensions
{
    public static IObservable<DialogResult> ShowDialogObservable(this Form form)
    {
        return Observable.Create<DialogResult>(o =>
        {
            o.OnNext(form.ShowDialog());
            return Disposable.Empty;
        });
    }
}
公共静态类扩展
{
公共静态IObservable ShowDialogObservable(此表单)
{
返回可观察的。创建(o=>
{
o、 OnNext(form.ShowDialog());
返回一次性。空;
});
}
}

我想这是可行的,尽管我不明白这一点

public static class Extensions
{
    public static IObservable<DialogResult> ShowDialogObservable(this Form form)
    {
        return Observable.Create<DialogResult>(o =>
        {
            o.OnNext(form.ShowDialog());
            return Disposable.Empty;
        });
    }
}
公共静态类扩展
{
公共静态IObservable ShowDialogObservable(此表单)
{
返回可观察的。创建(o=>
{
o、 OnNext(form.ShowDialog());
返回一次性。空;
});
}
}

您为什么想要这个?如果你在非UI线程中进行UI工作,你认为会发生什么?我不知道。我真的是个新手,正在尝试使用反应式扩展异步编写所有代码。请不要这样做。尝试只在有意义时运行异步代码。你最好在应该应用它的时候阅读,然后以一种良好的方式应用它。这注定要失败。严厉的言辞,但善意的建议。例如,在执行I/O操作时,或者需要在单独的线程上完成繁重的cpu工作时,可以使用它。编写异步代码不应该是一个目标,而应该是解决特定问题的一种方法。为什么要这样做?如果你在非UI线程中进行UI工作,你认为会发生什么?我不知道。我真的是个新手,正在尝试使用反应式扩展异步编写所有代码。请不要这样做。尝试只在有意义时运行异步代码。你最好在应该应用它的时候阅读,然后以一种良好的方式应用它。这注定要失败。严厉的言辞,但善意的建议。例如,在执行I/O操作时,或者需要在单独的线程上完成繁重的cpu工作时,可以使用它。编写异步代码不应该是一个目标,而应该是解决特定问题的一种方法。谢谢,我正在尝试异步返回DialogResult,尽管我不知道是否可以使用ShowDialog@Peter我在这里有很好的建议。没有办法将一个封闭的同步方法真正转变为异步方法<代码>显示对话框是一种阻塞、同步的方法。如果需要非阻塞表单,可以使用
Show
。这样做仍然会阻塞线程、资源等。谢谢,我正在尝试异步返回DialogResult,尽管我不知道是否可以使用ShowDialog@Peter我在这里有很好的建议。没有办法将一个封闭的同步方法真正转变为异步方法<代码>显示对话框是一种阻塞、同步的方法。如果需要非阻塞表单,可以使用
Show
。这样做仍然会阻塞线程、资源等。。