【问题标题】:Alternatives for polling?投票的替代方案?
【发布时间】:2015-03-04 04:34:49
【问题描述】:

我有一个 asp.net c# 桌面应用程序,它每 5 分钟不断轮询数据库数据。 这会导致服务器上的大量负载,进而降低其效率。

asp.net 中是否有任何技术支持独立于所用数据库的发布订阅模型? 我知道长轮询是一种选择。但我一直在寻找事件驱动的东西,而不是长时间轮询数据。 任何帮助将不胜感激。

【问题讨论】:

  • 是的。桌面应用程序。它不涉及浏览器。
  • 您可以使用消息传递技术来提供发布/订阅功能。像 ActiveMQ、MSMQ 之类的东西,或者如果你真的很有钱,Solace。
  • 在 asp.net 中没有内置技术可以做到这一点 - 但不确定您所说的 asp.net 桌面应用程序是什么意思。您的意思是您使用的是 Web 服务还是 WCF 服务?
  • 是的..我有一个网络服务..我如何连接到 Aspentech?除了投票还有其他选择吗?

标签: c# asp.net signalr long-polling polling


【解决方案1】:

如果您实际使用的是 ASP.net,您可以添加the SignalR framework 来为您的桌面应用程序建立推送通道。

在服务器端,添加 Microsoft.AspNet.SignalR nuget 包(Install-Package Microsoft.AspNet.SignalR);在客户端,添加 Microsoft.AspNet.SignalR.Client (Install-Package Microsoft.AspNet.SignalR.Client)。

这样,您可以在对数据库进行更新时通知所有客户,如下所示:

public void AddCustomer(Customer customer)
{
    using (var db = new CustomerContext)
    {
        db.Customers.Add(customer);
        db.SaveChanges();
    }

    var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
    hub(customer.Id);
}

【讨论】:

  • 好的.. 我没有更多的客户。只有一个桌面应用程序..和一个数据库服务器..它有很多 Dbs 可供参考。像甲骨文、阿斯彭科技等等。所以请具体的cmets。
  • 您能告诉我们这是一个 ASP.net 应用程序吗?我看不出 ASP.net 是如何在这里发挥作用的。如果它是一个独立的桌面应用程序,我的回答不适用。
  • 前端是asp.net c#应用。但它轮询的数据来自几个不同的数据库。
  • ASP.net 是一种网络技术,而不是桌面应用程序平台,所以我仍然不确定您的意思。
  • 对不起.. 我只是想把它带回家的一点是 c# 桌面应用程序:) 是的.. 不是 asp.net..
【解决方案2】:

我认为您正在寻找类似反应式扩展的东西。

http://msdn.microsoft.com/en-gb/data/gg577610.aspx

在幕后,这一切都是通过一些轮询实现来完成的,但我们的想法是让事件循环尽可能高效地监控轮询。

【讨论】:

  • 这看起来很有希望.. 但看不到太多文档.. 这个方向还有更多链接吗?
  • blogs.msdn.com/b/rxteam/archive/2013/12/13/… 另请查看 SignalR 和消息传递的答案。它们都对您描述的场景有效。
  • 谢谢!在 SignalR 的情况下,由于我有一个桌面应用程序,它使用长轮询技术对吗?
  • 正确使用SignalR非常有效。如果您想避免许多客户端一直访问数据库,请将结果缓存在服务器上。或者,让服务器每 5 分钟读取一次 DB 状态,并向所有订阅浏览器发送一条消息,表明 DB 仍然存在。
  • 您好,我的客户不多。只是一个桌面应用程序。我不想不断地轮询数据库,即使每 5 分钟一次也是昂贵的,因为我有很多数据库要轮询。只是一个桌面应用程序和许多数据库..
【解决方案3】:

通常您可以使用任何消息服务来执行此操作。

请记住以下 .net 消息服务:

【讨论】:

  • 所有这些服务都使用长轮询作为后备,对吗?除了长轮询,桌面应用程序还有其他选择吗?
  • @BadarinathKatti 如果您使用 Oracle,您可以创建在 CRUD(插入、读取、更新、删除)时执行的触发器。在 TSQL 的情况下,您可以创建除了其任务之外还执行推送的过程。然而,这并不独立于数据库。
  • 我不明白。如果有触发器,我的前端应用程序如何知道?有没有办法让我的 asp.net 应用程序知道是否触发了某个触发器?此外,我正在寻找插入的特定值..所以 CRUD 不在其中..
【解决方案4】:

我不知道您在这里处理什么或多少数据,所以这个答案可能工作量太大,除非您想要查看的数据/数据库表数量很少。

不要每 5 分钟提取一组数据,而是向您的数据库添加一个具有单个日期时间字段的表。然后在要监视的表上创建触发器(在添加/编辑/删除/任何内容上)。让它在触发触发器时更新您创建的表中的日期时间。

将您的桌面应用程序更改为仅每 5 分钟提取一次该日期时间值,将该值缓存在某处并在每次轮询时进行比较,如果日期时间发生变化;然后您的桌面应用程序可以触发所需的数据更新。

【讨论】:

  • 嗨..我有数百个数据库。我需要对他们每一个人进行投票。它不在 CRUD 上。我轮询列的特定值。如果该列的值是我正在寻找的东西,那么我才想要采取行动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多