对可观察的订阅未达到完成状态 [英] Subscription on observable not reaching to oncompleted

查看:47
本文介绍了对可观察的订阅未达到完成状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我正在尝试为wcf调用创建一个可观察的包装器,我创建了如下所示。



方法是这样的,

 private IObservable< List< string>>搜索(字符串searchTerm)
{
返回Observable.Create< List< string>>(o =>
{
var searchClient = new SearchServiceClient();
var s = Observable
.FromEventPattern< SearchCompletedEventArgs>(searchClient," SearchCompleted");
var subscription = s.Subscribe(
r =>
{
if(r.EventArgs.Error == null)
o.OnNext(r.EventArgs.Result);
else
{
o.OnError(r.EventArgs.Error) ;
}
},
e =>
{
o.OnError(e);
},
()=>
{
o.OnCompleted();
});
searchClient.SearchAsync(searchTerm);
退货订阅;
});
}

和方法调用是,

搜索("被动")。订阅(
r =>
{
MessageBox.Show(" Result");
},
e =>
{
MessageBox.Show(e.ToString());
} ,
()=>
{
MessageBox.Show(" Completed");
});

但它永远不会达到完成的块。你能告诉我哪里出错吗?





解决方案

您的问题似乎是您正在从事件模式到Observable Sequence并希望事件以某种方式通知您完成。这是.NET中的一个事件和一个Observable Sequence之间的关键区别之一,
后来有错误和完成语义。


更具体的你的`s`序列永远不会完成,所以永远不会完成给你的消费者。然而,好消息是,您知道该事件只会被提升一次,因此您可以更改您的实施。

 private IObservable< List< string>>搜索(字符串searchTerm)
{
返回Observable.Create< List< string>>(o =>
{
var searchClient = new SearchServiceClient();
var s = Observable.FromEventPattern< SearchCompletedEventArgs>(searchClient," SearchCompleted");
var subscription = s.Subscribe(
r =>
{
if(r。 EventArgs.Error == null)
{
o.OnNext(r.EventArgs.Result);
o.OnCompleted();
}
else
{
o.OnError(r.EventArgs.Error);
}
});
searchClient.SearchAsync(searchTerm);
返回订阅;
});
}

HTH




I am trying to create an observable wrapper for wcf call and I created as bellow.

The method is like this,

private IObservable<List<string>> Search(string searchTerm)
        {
            return Observable.Create<List<string>>(o =>
            {
                var searchClient = new SearchServiceClient();
                var s = Observable
                    .FromEventPattern<SearchCompletedEventArgs>(searchClient, "SearchCompleted");
                var subscription = s.Subscribe(
                    r =>
                    {
                        if (r.EventArgs.Error == null)
                            o.OnNext(r.EventArgs.Result);
                        else
                        {
                            o.OnError(r.EventArgs.Error);
                        }
                    },
                        e =>
                        {
                            o.OnError(e);
                        },
                            () =>
                            {
                                o.OnCompleted();
                            });
                searchClient.SearchAsync(searchTerm);
                return subscription;
            });
        }

and method call is,

Search("reactive").Subscribe(
                       r =>
                       {
                           MessageBox.Show("Result");
                       },
                       e =>
                       {
                           MessageBox.Show(e.ToString());
                       },
                       () =>
                       {
                           MessageBox.Show("Completed");
                       });

But it is never reaching to completed block. Could you suggest where I am going wrong?


解决方案

Your problem seems to be that you are converting from an event pattern to an Observable Sequence and hoping that the event will somehow notify you of a completion. This is one of the key differences between an event in .NET and an Observable Sequence, the later have error and completion semantics.

To be more specific your `s` sequence will never complete, so will never pass the completion to your consumers. The good news is however, that you know that the event will only be raised once, so you can change your implementation.

private IObservable<List<string>> Search(string searchTerm)
{
	return Observable.Create<List<string>>(o =>
	{
		var searchClient = new SearchServiceClient();
		var s = Observable.FromEventPattern<SearchCompletedEventArgs>(searchClient, "SearchCompleted");
		var subscription = s.Subscribe(
			r =>
			{
				if (r.EventArgs.Error == null)
				{
					o.OnNext(r.EventArgs.Result);
					o.OnCompleted();
				}
				else
				{
					o.OnError(r.EventArgs.Error);
				}
			});
		searchClient.SearchAsync(searchTerm);
		return subscription;
	});
}

HTH

Lee


这篇关于对可观察的订阅未达到完成状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆