Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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_System.reactive_Reactive Programming - Fatal编程技术网

C# 反应式扩展-以同步方式刷新主体/对象

C# 反应式扩展-以同步方式刷新主体/对象,c#,.net,system.reactive,reactive-programming,C#,.net,System.reactive,Reactive Programming,编辑:我编辑了几行代码,当在IDE中运行时,它会失败,没有错误或任何东西 我不熟悉被动扩展,有一个问题我正试图解决。我使用RX对机器上的事件进行排队,然后每隔一段时间将数据发送到服务器。我的问题似乎是,当应用程序关闭时,任何类型的异步调用似乎只是取消而不运行,因此最后一批事件永远不会被发送 我有一个主题,其中Event是我的数据类。我现在知道,一门学科可能不是最好的课程,但我们到了 我的代码大致如下,为了清晰起见,添加了一些注释: IObservable<IList<Event>

编辑:我编辑了几行代码,当在IDE中运行时,它会失败,没有错误或任何东西

我不熟悉被动扩展,有一个问题我正试图解决。我使用RX对机器上的事件进行排队,然后每隔一段时间将数据发送到服务器。我的问题似乎是,当应用程序关闭时,任何类型的异步调用似乎只是取消而不运行,因此最后一批事件永远不会被发送

我有一个主题,其中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
结尾时完成。那会发生吗?你能提供一张照片给我们看吗?