C# 反应式扩展-以同步方式刷新主体/对象
编辑:我编辑了几行代码,当在IDE中运行时,它会失败,没有错误或任何东西 我不熟悉被动扩展,有一个问题我正试图解决。我使用RX对机器上的事件进行排队,然后每隔一段时间将数据发送到服务器。我的问题似乎是,当应用程序关闭时,任何类型的异步调用似乎只是取消而不运行,因此最后一批事件永远不会被发送 我有一个主题,其中Event是我的数据类。我现在知道,一门学科可能不是最好的课程,但我们到了 我的代码大致如下,为了清晰起见,添加了一些注释:C# 反应式扩展-以同步方式刷新主体/对象,c#,.net,system.reactive,reactive-programming,C#,.net,System.reactive,Reactive Programming,编辑:我编辑了几行代码,当在IDE中运行时,它会失败,没有错误或任何东西 我不熟悉被动扩展,有一个问题我正试图解决。我使用RX对机器上的事件进行排队,然后每隔一段时间将数据发送到服务器。我的问题似乎是,当应用程序关闭时,任何类型的异步调用似乎只是取消而不运行,因此最后一批事件永远不会被发送 我有一个主题,其中Event是我的数据类。我现在知道,一门学科可能不是最好的课程,但我们到了 我的代码大致如下,为了清晰起见,添加了一些注释: IObservable<IList<Event>
IObservable<IList<Event>> eventsObserver = Instance.EventBuffer.ToList<Event>();
var eventsEnumerable = eventsObserver.ToEnumerable();
List<Event> events = new List<Event>();
try
{
events = (List<Event>)eventsEnumerable.First(); // THIS LINE FAILS SILENTLY, EVEN IN DEBUGGER...
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine("Error: " + ex.Message);
}
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(someURI);
HttpResponseMessage response = client.PostAsync(somePage, new StringContent(SerializeToJSON(events))).Result;
response.EnsureSuccessStatusCode();
}
IObservable eventsObserver=Instance.EventBuffer.ToList();
var eventsEnumerable=eventsObserver.ToEnumerable();
列表事件=新列表();
尝试
{
events=(List)eventsEnumerable.First();//即使在调试器中,此行也会以静默方式失败。。。
}
捕获(例外情况除外)
{
System.Diagnostics.Debug.WriteLine(“错误:+ex.Message”);
}
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(someURI);
HttpResponseMessage response=client.PostAsync(somePage,新StringContent(SerializeToJSON(events))).Result;
response.EnsureSuccessStatusCode();
}
如果我没有对web服务器进行同步调用(使用“.Result”),它将在那里失败。我已经尝试了很多方法将IObservable中的数据转换成我可以发送的内容,但是要么代码失败(通常是某种类型的错误转换),要么事件尚未放入我想要发送的数据结构中。我知道RX本质上是异步的,我要求以同步的方式处理它,我认为会有一个解决方案。提前谢谢 假设您控制可观察的源,您可以调用
Observable.OnComplete()
就像Enigmativity指出的那样。否则,您可以尝试在缓冲之前保留接收到的每个值的副本:
Observable.Do(x => localCopy = x).Buffer(..)
关闭时您可以访问此本地副本
在任何情况下,请注意,
.First()
在最新的Rx版本中被标记为过时,这可能是为了避免您遇到的问题。对eventsEnumerable.First()
的调用仅在可观察的实例.EventBuffer
以OnCompleted
结尾时完成。那会发生吗?你能提供一张照片给我们看吗?