可观察的等待方法C#

可观察的等待方法C#,c#,system.reactive,C#,System.reactive,Observable.FromAsyncPattern可用于创建一个可从BeginX EndX样式的异步方法进行观察 也许我误解了这一点,但是有没有类似的函数可以从新的异步风格的方法中创建一个可观察的对象呢。。Stream.ReadAsync?您可以使用以下方法从任务创建一个IObservable: 使用System.Reactive.Threading.Tasks; 流s=。。。; IObservable o=s.ReadAsync(缓冲区、偏移量、计数); 请注意,Lee的答案是正确的,但最

Observable.FromAsyncPattern可用于创建一个可从BeginX EndX样式的异步方法进行观察


也许我误解了这一点,但是有没有类似的函数可以从新的异步风格的方法中创建一个可观察的对象呢。。Stream.ReadAsync?

您可以使用以下方法从
任务创建一个
IObservable

使用System.Reactive.Threading.Tasks;
流s=。。。;
IObservable o=s.ReadAsync(缓冲区、偏移量、计数);

请注意,Lee的答案是正确的,但最终我所做的是使用Observable.Create来持续读取流,请参见下文--

公共静态IConnectableObservable GetReadObservable(此CommandReader)
{
返回可观察的。创建(异步(主题、标记)=>
{
尝试
{
while(true)
{
if(令牌.IsCancellationRequested)
{
subject.OnCompleted();
返回;
}
Command cmd=await reader.ReadCommandAsync();
subject.OnNext(cmd);
}
}
捕获(例外情况除外)
{
尝试
{
受试者。一个错误(ex);
}
捕获(例外)
{
WriteLine(“在尝试调用可观察主题上的OnError时引发了异常,这意味着您没有到处捕获异常”);
投掷;
}
}
}).Publish();
}

Stream.ReadAsync
返回一个
任务
而不是
IObservable
。没错。我想使用ReadAsync方法创建一个可观察的对象。就像我使用Observable.FromAsyncPattern和旧的Begin/End样式的异步方法一样。非常感谢,我会在允许的时候勾选您的答案。
using System.Reactive.Threading.Tasks;

Stream s = ...;
IObservable<int> o = s.ReadAsync(buffer, offset, count).ToObservable();
    public static IConnectableObservable<Command> GetReadObservable(this CommandReader reader)
    {

       return Observable.Create<Command>(async (subject, token) =>
        {


            try
            {

                while (true)
                {

                    if (token.IsCancellationRequested)
                    {
                        subject.OnCompleted();
                        return;
                    }

                    Command cmd = await reader.ReadCommandAsync();

                    subject.OnNext(cmd);

                }

            }

            catch (Exception ex)
            {
                try
                {
                    subject.OnError(ex);
                }
                catch (Exception)
                {
                    Debug.WriteLine("An exception was thrown while trying to call OnError on the observable subject -- means you're not catching exceptions everywhere");
                    throw;
                }
            }

        }).Publish();

    }