Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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# 在WebForms中使用Rx执行长时间运行的任务_C#_.net_Visual Studio 2012_Webforms_System.reactive - Fatal编程技术网

C# 在WebForms中使用Rx执行长时间运行的任务

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

我刚刚阅读了全部内容,正在努力处理代码,试图在WebForms页面中实现一个长时间运行的任务,并使用Rx检索值。我开始认为这是不可能的,但我认为无论如何问这个问题都是有建设性的,因为Rx的信息非常有限,更不用说网络表单旁边的Rx了(还没有找到一篇文章/文章同时提到这两个方面)

我想要实现的其实很简单。我有一个从csv文件中读取数据并对其进行大量处理的方法。目前,它填充两个列表,一个是“成功消息”,另一个是“错误消息”。目前的设计是公认的相当糟糕,但请容忍我在这个问题上

然后将这两个列表绑定到aspx中的两个不同GridView

这里的问题是任务需要很长时间才能完成,我们不想让用户在没有任何反馈的情况下等待很长时间

在我看来,当前的实现非常糟糕,但有效:

  • 用户通过控件选择.csv文件
  • 在页面上单击一个按钮以启动该过程
  • 然后创建两个列表并存储在会话密钥中
  • 创建一个后台线程并接收长时间运行的void方法,该方法依次接收两个列表,并在每次迭代时向它们添加新消息。线程本身也存储在单独的会话变量中
  • 页面上已启用计时器,间隔设置为1000(1秒)
  • 当计时器滴答作响时,GridView与列表进行数据绑定,更新接口
  • 在加载页面上,检查线程变量是否仍处于活动状态,如果未处于活动状态,则禁用计时器
  • 有没有一种方法可以在没有会话变量的情况下使用Rx来实现这一点?我认为可以使用
    .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窗体环境,只是把事情委托给正确的线程来处理,对吗?