C# 等待可观测的第n个OnNext()

C# 等待可观测的第n个OnNext(),c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,假设我有一个可观察的对象,它多次调用OnNext()。我希望等待参数满足特定条件的那一刻。我该怎么做 这几乎与post中等待流程执行的示例相似: public static TaskAwaiter<int> GetAwaiter(this Process process) { var tcs = new TaskCompletionSource<int>(); process.EnableRaisingEvents = true; proc

假设我有一个可观察的对象,它多次调用
OnNext()
。我希望
等待
参数满足特定条件的那一刻。我该怎么做

这几乎与post中等待流程执行的示例相似:

public static TaskAwaiter<int> GetAwaiter(this Process process) 
{ 
    var tcs = new TaskCompletionSource<int>(); 
    process.EnableRaisingEvents = true; 
    process.Exited += (s, e) => tcs.TrySetResult(process.ExitCode); 
    if (process.HasExited) tcs.TrySetResult(process.ExitCode); 
    return tcs.Task.GetAwaiter(); 
}
有人能告诉我在哪里能找到解决办法吗。我已经实现了一个观察器,它会在OnNext捕捉到
LastMessageType
消息时引发一个事件,但这是不可等待的。像这样:

public static TaskAwaiter<int> ProcessMessage(this MyBus bus, BeginMessage message)
{
    var tcs = new TaskCompletionSource<int>();
    var observcer = new MessageObserver();
    observcer.LastMessageRecieved += () => tcs.SetResult(1);
    return tcs.Task.GetAwaiter();
}
publicstatictaskawaiter进程消息(此MyBus总线,BeginMessage消息)
{
var tcs=new TaskCompletionSource();
var observector=new MessageObserver();
observector.lastmessagereceived+=()=>tcs.SetResult(1);
返回tcs.Task.GetAwaiter();
}
因此,我想做的是:

var initialMessage = ConstructInitialMessage();
var bus = new MessageBus();
await bus.Process(initialMessage);
await bus.Process(initialMessage);
您可以使用Rx来实现这一点(从项目中引用Rx后,使用System.Reactive.Linq;
)添加
)。这样做的目的是等待可观察对象完成(在其观察者上调用
OnCompleted

如果出于某种原因,您无法修复可观察对象以正确完成,那么您将不得不创建一个新的可观察对象,该对象将在原始可观察对象结束时结束。为此,可以将
FirstAsync()
与谓词一起使用:

await bus.Process(initialMessage).FirstAsync(
    message => message.Type == finalType 
        && message.Stage == MessageRecieved.MessageStage.Handled);
我已经实现了一个观察器[…],但它不是等待的


该代码的问题在于,您的代码返回了
TaskAwaiter
<代码>任务等待者
不可等待,而任务
本身可等待。因此,如果您将代码更改为只返回tcs.Task和更改返回类型,它应该可以工作。

您自己没有实现
IObservable
是吗?因为从来没有推荐过这样的用例。@StephenCleary-你是说我是否使用了BCL IObservable()?是的。为什么不好?你能给我指一个资源来解释为什么我不应该这么做吗;该页上的示例代码完全错误<代码>IObservable具有特定的线程要求,该示例代码完全忽略了这些要求。(第6节)间接指出,您不应该自己实现该接口。@StephenCleary-非常有趣。。。谢谢我还考虑过使用反应式扩展。因此,我可以做的是在总线的Post上引发事件,并使用Rx来做一些事情,以防发布
FinalMessageType
。@spike我认为在没有Rx的情况下使用
IObservable
没有多大意义,它非常有用。我将尝试一下-太棒了!
await bus.Process(initialMessage).FirstAsync(
    message => message.Type == finalType 
        && message.Stage == MessageRecieved.MessageStage.Handled);