C# 使用Rx轮询网站

C# 使用Rx轮询网站,c#,.net,system.reactive,C#,.net,System.reactive,只是想让我的头脑清醒一下 我使用Rx每2秒轮询一个网站 var results = new List<MyDTO>(); var cx = new WebserviceAPI( ... ); var callback = cx.GetDataAsync().Subscribe(rs => { results.AddRange(rs); }); var poller = Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe(

只是想让我的头脑清醒一下

我使用Rx每2秒轮询一个网站

var results = new List<MyDTO>();
var cx = new WebserviceAPI( ... );
var callback = cx.GetDataAsync().Subscribe(rs => { results.AddRange(rs); });
var poller = Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe( _ => { cx.StartGetDataAsync(); });
并使其发挥作用。但我仍然不确定这样做是否正确

编辑2-Web服务信号: 我正在使用webServiceApi类包装的soap web服务。创建的references.cs包含以下方法

public void getItemsAsync(GetItemsReq request, object userState) 
{
    if ((this.getItemsOperationCompleted == null)) 
    {
        this.getItemsOperationCompleted = new System.Threading.SendOrPostCallback(this.OngetItemsOperationCompleted);
    }
    this.InvokeAsync("getItems", new object[] {
                    request}, this.getItemsOperationCompleted, userState);
}

private System.Threading.SendOrPostCallback getItemsOperationCompleted;

public event getItemsCompletedEventHandler getItemsCompleted;

public delegate void getItemsCompletedEventHandler(object sender, getItemsCompletedEventArgs e);

public partial class getItemsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs 
{
    ...
}

private void OngetItemsOperationCompleted(object arg) 
{
    if ((this.getItemsCompleted != null)) 
    {
        System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
        this.getItemsCompleted(this, new getItemsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
    }
 }
可能给了你太多(或错过了什么)


Thx

我想我已经为你找到了一个不错的起点

基本上,我认为您需要抽象出web服务的复杂性,并创建一个干净的函数来获得结果

试着这样做:

Func<GetItemsReq, IObservable<getItemsCompletedEventArgs>> fetch =
    rq =>
        Observable.Create<getItemsCompletedEventArgs>(o =>
        {
            var cx = new WebserviceAPI(/* ... */);
            var state = new object();
            var res =
                Observable
                    .FromEventPattern<
                        getItemsCompletedEventHandler,
                        getItemsCompletedEventArgs>(
                        h => cx.getItemsCompleted += h,
                        h => cx.getItemsCompleted -= h)
                    .Where(x => x.EventArgs.UserState == state)
                    .Take(1)
                    .Select(x => x.EventArgs);
            var subscription = res.Subscribe(o);
            cx.getItemsAsync(rq, state);
            return subscription;
        });
Func fetch=
rq=>
创建(o=>
{
var cx=新的WebserviceAPI(/*…*/);
var state=新对象();
var res=
可观察
.FromEventPattern<
getItemsCompletedEventHandler,
getItemsCompletedEventArgs>(
h=>cx.getItemsCompleted+=h,
h=>cx.getItemsCompleted-=h)
.Where(x=>x.EventArgs.UserState==state)
.采取(1)
.Select(x=>x.EventArgs);
var认购=res.Subscribe(o);
cx.getItemsAsync(rq,state);
退订;
});
就我个人而言,我会更进一步,定义一个返回类型,比如说
GetItemsReq
,它不包括用户状态对象,但基本上与
getItemsCompletedEventArgs
相同

然后,您应该能够使用
Observable.Interval
创建所需的轮询

如果您的web服务实现了
IDisposable
,那么您应该添加一个
Observable。在上述函数中使用
调用,以便在web服务完成后正确地处置它


如果这有帮助,请告诉我。

谜团有一个很好的解决方案

这些语句是解决错误的关键


每次调用异步方法时,都需要向其传递一个唯一的对象(当然,除非一次只运行一个异步方法,这是极不可能的)。我花了好几个小时才发现可以传递一个对象参数。如果没有参数,它将看到多个方法作为同一个调用,并向您发送“项已被添加。输入字典:'System.Object'正在添加的键:'System.Object'”消息。

您可以发布web服务的方法/事件签名吗?刚刚看到您的答复。恐怕我需要一点时间来消化它,让我的头脑清醒过来!很多很多thx。索克。我想我明白了。。。杰出的再次非常感谢。斯菲。。。其他补充答案在这里。。。
public void getItemsAsync(GetItemsReq request, object userState) 
{
    if ((this.getItemsOperationCompleted == null)) 
    {
        this.getItemsOperationCompleted = new System.Threading.SendOrPostCallback(this.OngetItemsOperationCompleted);
    }
    this.InvokeAsync("getItems", new object[] {
                    request}, this.getItemsOperationCompleted, userState);
}

private System.Threading.SendOrPostCallback getItemsOperationCompleted;

public event getItemsCompletedEventHandler getItemsCompleted;

public delegate void getItemsCompletedEventHandler(object sender, getItemsCompletedEventArgs e);

public partial class getItemsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs 
{
    ...
}

private void OngetItemsOperationCompleted(object arg) 
{
    if ((this.getItemsCompleted != null)) 
    {
        System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
        this.getItemsCompleted(this, new getItemsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
    }
 }
Func<GetItemsReq, IObservable<getItemsCompletedEventArgs>> fetch =
    rq =>
        Observable.Create<getItemsCompletedEventArgs>(o =>
        {
            var cx = new WebserviceAPI(/* ... */);
            var state = new object();
            var res =
                Observable
                    .FromEventPattern<
                        getItemsCompletedEventHandler,
                        getItemsCompletedEventArgs>(
                        h => cx.getItemsCompleted += h,
                        h => cx.getItemsCompleted -= h)
                    .Where(x => x.EventArgs.UserState == state)
                    .Take(1)
                    .Select(x => x.EventArgs);
            var subscription = res.Subscribe(o);
            cx.getItemsAsync(rq, state);
            return subscription;
        });
          var state = new object();

          cx.getItemsAsync(rq, state);