Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可观察到的订阅未达到未完成_C#_.net_Wcf_System.reactive - Fatal编程技术网

C# 可观察到的订阅未达到未完成

C# 可观察到的订阅未达到未完成,c#,.net,wcf,system.reactive,C#,.net,Wcf,System.reactive,我正在尝试为wcf调用创建一个可观察的包装器,我创建的代码如下 方法是这样的, private IObservable<List<string>> Search(string searchTerm) { return Observable.Create<List<string>>(o => { var searchClient = new SearchServiceClient(

我正在尝试为wcf调用创建一个可观察的包装器,我创建的代码如下

方法是这样的,

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;
        });
    }
但它永远不会到达完成的区块。你能告诉我哪里出了问题吗

@26日编辑


谢谢Petar Vučetin、Rarous和Lee Campbell。我已经测试了所有三个建议,并且都有效。但我喜欢Petar的方法对单行代码的处理。即使它看起来是可观察的。FromAsyncPatterns已被删除。

如果您可以为WCF客户端生成异步方法,您可以尝试这种方法

 static void Main(string[] args)
        {
            var searcher = Search("test").Subscribe(Console.WriteLine);
            Console.WriteLine("Done");
            Console.ReadLine();
        }


        private static  IObservable<string[]> Search(string searchTerm)
        {
            var searchClient = new Service1Client();

            return Task<string[]>.Factory.FromAsync(searchClient.BeginGetData, searchClient.EndGetData, searchTerm, null).ToObservable();
        }
static void Main(字符串[]args)
{
var searcher=Search(“test”).Subscribe(Console.WriteLine);
控制台。写入线(“完成”);
Console.ReadLine();
}
专用静态IObservable搜索(字符串搜索术语)
{
var searchClient=new Service1Client();
返回Task.Factory.fromsync(searchClient.BeginGetData,searchClient.EndGetData,searchTerm,null).ToObservable();
}

如果可以为WCF客户端生成异步方法,则可以尝试这种方法

 static void Main(string[] args)
        {
            var searcher = Search("test").Subscribe(Console.WriteLine);
            Console.WriteLine("Done");
            Console.ReadLine();
        }


        private static  IObservable<string[]> Search(string searchTerm)
        {
            var searchClient = new Service1Client();

            return Task<string[]>.Factory.FromAsync(searchClient.BeginGetData, searchClient.EndGetData, searchTerm, null).ToObservable();
        }
static void Main(字符串[]args)
{
var searcher=Search(“test”).Subscribe(Console.WriteLine);
控制台。写入线(“完成”);
Console.ReadLine();
}
专用静态IObservable搜索(字符串搜索术语)
{
var searchClient=new Service1Client();
返回Task.Factory.fromsync(searchClient.BeginGetData,searchClient.EndGetData,searchTerm,null).ToObservable();
}

从事件创建的观察对象从未运行到完成。正如Petar提到的,您可以从异步模式创建可观察对象。您可以使用工厂方法,而不是将
任务
强制转换为可观察:

IObservable<string[]> Search(string searchTerm)
{
    var searchClient = new Service1Client();
    return Observable.FromAsyncPatterns(searchClient.BeginGetData, searchClient.EndGetData)(searchTerm);
}
IObservable搜索(字符串搜索词)
{
var searchClient=new Service1Client();
从AsyncPatterns(searchClient.BeginGetData,searchClient.EndGetData)返回可观察的.FromAsyncPatterns(searchTerm);
}

从事件创建的观察对象从未运行到完成。正如Petar提到的,您可以从异步模式创建可观察对象。您可以使用工厂方法,而不是将
任务
强制转换为可观察:

IObservable<string[]> Search(string searchTerm)
{
    var searchClient = new Service1Client();
    return Observable.FromAsyncPatterns(searchClient.BeginGetData, searchClient.EndGetData)(searchTerm);
}
IObservable搜索(字符串搜索词)
{
var searchClient=new Service1Client();
从AsyncPatterns(searchClient.BeginGetData,searchClient.EndGetData)返回可观察的.FromAsyncPatterns(searchTerm);
}

@Rarous是正确的。事件没有完成的概念,因此FromEventPattern永远不会完成(或出错)。我认为最受欢迎的方法是使用Task.FrasMyC.To可观察到的Petar Vu指定,然后考虑粗略指定的FrasMyCyc模式。如果您真的愿意,您可以通过如下方式更正代码

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;
    });
}
private IObservable搜索(字符串搜索词)
{
返回可观察的。创建(o=>
{
var searchClient=new SearchServiceClient();
var s=可观测
.FromEventPattern(searchClient,“SearchCompleted”);
var订阅=s.订阅(
r=>
{
if(r.EventArgs.Error==null)
{
o、 OnNext(r.EventArgs.Result);
o、 未完成();
}
其他的
{
o、 OnError(r.EventArgs.Error);
}
});
searchClient.SearchAsync(searchTerm);
退订;
});
}

@Rarous是正确的。事件没有完成的概念,因此FromEventPattern永远不会完成(或出错)。我认为最受欢迎的方法是使用Task.FrasMyC.To可观察到的Petar Vu指定,然后考虑粗略指定的FrasMyCyc模式。如果您真的愿意,您可以通过如下方式更正代码

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;
    });
}
private IObservable搜索(字符串搜索词)
{
返回可观察的。创建(o=>
{
var searchClient=new SearchServiceClient();
var s=可观测
.FromEventPattern(searchClient,“SearchCompleted”);
var订阅=s.订阅(
r=>
{
if(r.EventArgs.Error==null)
{
o、 OnNext(r.EventArgs.Result);
o、 未完成();
}
其他的
{
o、 OnError(r.EventArgs.Error);
}
});
searchClient.SearchAsync(searchTerm);
退订;
});
}

我认为最新的位使FromAsyncPatterns过时了。我知道了,我的目标仍然是.net 4.0。我认为最新的位使FromAsyncPatterns过时了。我知道了,我的目标仍然是.net 4.0。