通过可观察序列线程论证
Threading argument through observable sequence
我正在使用响应式 ui,但我 运行 遇到了一个问题,本质上是在我的登录方法中,我想显示一个进度对话框,尝试登录,然后关闭对话框return 最终结果。
问题的基本伪代码是这样的:
private IObservable<bool> AttemptLogin(CredentialPair pair)
{
return Dialogs.ShowProgress("logging in", "doing stuff...")
.SelectMany(progressController => DoTheActualLogin(pair))
.Subscribe(boolForWhetherLoginSucceeded =>
{
});
}
ShowProgress
return 一个 IObservable<ProgressController>
DoTheActualLogIn
return一个IObservable<bool>
问题是在执行登录后,我需要调用进度控制器的关闭方法。
我似乎想不出一种方法让控制器在序列中更进一步。
我确定有一个我遗漏的序列的组合器/做这样的事情的技术。
我想这就是你想要的:
(from progressController in Dialogs.ShowProgress("logging in", "doing stuff...")
from result in DoTheActualLogin(pair)
select new { result, progressController })
.Subscribe(anon => {...}, ex => {...})
Chris 的回答很好,尤其是当您必须在链的更下方使用 progressController 时。如果您只需要在登录后清理它,您可以这样做:
private IObservable<bool> AttemptLogin(CredentialPair pair)
{
return Dialogs.ShowProgress("logging in", "doing stuff...")
.SelectMany(progressController =>
DoTheActualLogin(pair).Finally(() => progressController.Close()))
.Subscribe(boolForWhetherLoginSucceeded =>
{
});
}
我正在使用响应式 ui,但我 运行 遇到了一个问题,本质上是在我的登录方法中,我想显示一个进度对话框,尝试登录,然后关闭对话框return 最终结果。
问题的基本伪代码是这样的:
private IObservable<bool> AttemptLogin(CredentialPair pair)
{
return Dialogs.ShowProgress("logging in", "doing stuff...")
.SelectMany(progressController => DoTheActualLogin(pair))
.Subscribe(boolForWhetherLoginSucceeded =>
{
});
}
ShowProgress
return 一个IObservable<ProgressController>
DoTheActualLogIn
return一个IObservable<bool>
问题是在执行登录后,我需要调用进度控制器的关闭方法。
我似乎想不出一种方法让控制器在序列中更进一步。
我确定有一个我遗漏的序列的组合器/做这样的事情的技术。
我想这就是你想要的:
(from progressController in Dialogs.ShowProgress("logging in", "doing stuff...")
from result in DoTheActualLogin(pair)
select new { result, progressController })
.Subscribe(anon => {...}, ex => {...})
Chris 的回答很好,尤其是当您必须在链的更下方使用 progressController 时。如果您只需要在登录后清理它,您可以这样做:
private IObservable<bool> AttemptLogin(CredentialPair pair)
{
return Dialogs.ShowProgress("logging in", "doing stuff...")
.SelectMany(progressController =>
DoTheActualLogin(pair).Finally(() => progressController.Close()))
.Subscribe(boolForWhetherLoginSucceeded =>
{
});
}