C# 使用Rx轮询网站
只是想让我的头脑清醒一下 我使用Rx每2秒轮询一个网站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(
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);