C# 在WebForms中使用Rx执行长时间运行的任务
我刚刚阅读了全部内容,正在努力处理代码,试图在WebForms页面中实现一个长时间运行的任务,并使用Rx检索值。我开始认为这是不可能的,但我认为无论如何问这个问题都是有建设性的,因为Rx的信息非常有限,更不用说网络表单旁边的Rx了(还没有找到一篇文章/文章同时提到这两个方面) 我想要实现的其实很简单。我有一个从csv文件中读取数据并对其进行大量处理的方法。目前,它填充两个列表,一个是“成功消息”,另一个是“错误消息”。目前的设计是公认的相当糟糕,但请容忍我在这个问题上 然后将这两个列表绑定到aspx中的两个不同GridView 这里的问题是任务需要很长时间才能完成,我们不想让用户在没有任何反馈的情况下等待很长时间 在我看来,当前的实现非常糟糕,但有效:C# 在WebForms中使用Rx执行长时间运行的任务,c#,.net,visual-studio-2012,webforms,system.reactive,C#,.net,Visual Studio 2012,Webforms,System.reactive,我刚刚阅读了全部内容,正在努力处理代码,试图在WebForms页面中实现一个长时间运行的任务,并使用Rx检索值。我开始认为这是不可能的,但我认为无论如何问这个问题都是有建设性的,因为Rx的信息非常有限,更不用说网络表单旁边的Rx了(还没有找到一篇文章/文章同时提到这两个方面) 我想要实现的其实很简单。我有一个从csv文件中读取数据并对其进行大量处理的方法。目前,它填充两个列表,一个是“成功消息”,另一个是“错误消息”。目前的设计是公认的相当糟糕,但请容忍我在这个问题上 然后将这两个列表绑定到as
.Scan
方法来组合消息的整个历史记录(这就是我的原因),单击触发器启动所有操作,勾选触发器以实际接收消息。然后,订阅代码将是结果与GridView的简单绑定。由于WebForms中的数据源不保留旧值,因此需要在每次勾选时刷新所有内容
实际上,我可以编写其中的大部分内容,但当委托绑定网格时,什么也没有发生,因为这一切都发生在其他线程上。我看不到控制所有这些的方法,因为对webapplication的每个请求都是在未知线程上启动的。在这种情况下,有没有一种方法可以模拟WPF或WinForms应用程序上发生的用户交互来实现这一点?我将尝试回答这个问题。IEnumerable和IObservable之间的主要区别是pull和push。也就是说,IEnumerable仅在请求下一个值时返回下一个值,而IObservable通过
.OnNext()
立即将下一个值推出。这表明IObservable与轮询客户端不兼容,轮询客户端基本上是基于拉的
对我来说,RX在该场景中有意义的唯一方法是使用WebSocket,它支持来自服务器的基于推送的通信。(是ASP.Net的一个很好的“官方”WebSocket集成。)这将允许您将服务器数据源作为订阅服务器连接到后台线程的IObservable。观察者线程将立即接收新事件,然后可以立即将它们推送到客户端进行显示
我理解,这种方法需要大量的重新考虑。我只是不认为在消费者只是做一个完全刷新民意调查的情况下,切换到RX可观察源有什么意义。很抱歉文章/书中缺少Web内容。在过去的几年中,我几乎只使用WPF/Silverlight for UI。就在最近,我启动了一个Web项目,我也有一个长时间运行的查询,它将数据滴回到用户手中,这肯定比WinForm/WPF/Silverlight要困难得多 我沿着信号器的路径走,但即使这样,似乎也与Rx有一些摩擦。我面临的主要问题是Rx不阻塞,因此我调用的信号器方法很快完成,然后连接被切断。如果我能弄清楚如何做好,我将在这里发布要使用的模式
但是你要知道,你并不孤单……如果与信号器/WebSocket相结合,这种接收方法听起来会更有效。是的,我明白你的观点。我只是认为通过使用Rx,我可以避免事件管道和不必要的会话存储。实际上,最让我困扰的是服务器上的存储。通过使用scan,我将能够从订阅中获得自动缓存的结果。我仍然很好奇,如果不使用WebSocket,是否有可能实现这一点。我仍然会看一看SignalR,我以前听说过它,但从来没有停下来看看它是如何工作的并与WebForms集成的。有没有讨论过这方面的东西?我很想知道你已经尝试过的事情,以及你是如何做到的。另外,使用Rx而不使用信号机是否有解决办法?我的意思是,所有的事件都在那里,WebForms已经“伪造”了一个Windows窗体环境,只是把事情委托给正确的线程来处理,对吗?