轮询的替代方案是什么?

3
我有一个asp.net c#桌面应用程序,每5分钟不断地轮询数据库数据。 这会导致服务器负载过大,从而降低其效率。
是否有任何asp.net技术支持独立于数据库使用的发布订阅模型? 我知道长轮询是其中一种替代方案。但我正在寻找某些事件驱动的东西,而不是长时间轮询数据。 任何帮助都将不胜感激。

是的,这是一个桌面应用程序。它不涉及浏览器。 - Badarinath Katti
1
你可以使用消息传递技术来提供发布/订阅功能。类似于ActiveMQ、MSMQ或者如果你真的很有钱,Solace。 - kha
ASP.NET 中没有内置的技术来完成这个任务 - 不确定您所说的 ASP.NET 桌面应用程序是什么意思。您是指使用 Web 服务或 WCF 服务吗? - Rikalous
是的,我有一个Web服务。我如何连接到Aspentech?除了轮询之外,还有其他选择吗? - Badarinath Katti
4个回答

3
如果您正在使用ASP.net,可以添加SignalR框架来建立与桌面应用程序的推送通道。
在服务器端,添加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);
}

好的,我没有更多的客户了。只有一个桌面应用程序和一个数据库服务器。它有许多要参考的数据库,如Oracle、Aspen Tech等。所以请给出具体的评论。 - Badarinath Katti
你能告诉我们这是一个ASP.net应用程序吗?我不明白ASP.net在这里起什么作用。如果它是一个独立的桌面应用程序,我的答案就不适用了。 - Frank
前端是asp.net c#应用程序。但它所获取的数据来自多个不同的数据库。 - Badarinath Katti
1
ASP.net是一种网络技术,而不是桌面应用程序平台,因此我仍然不确定你的意思。 - Rikalous
抱歉..我只是想强调这是一个C#桌面应用程序 :) 是的..不是ASP.NET.. - Badarinath Katti

1

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

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

在底层,所有这些都是通过一些轮询的实现来完成的,但是想法是尽可能使事件循环监控轮询变得高效。

这看起来很有前途.. 但是没有看到太多的文档.. 还有其他相关链接吗? - Badarinath Katti
请查看以下链接:http://blogs.msdn.com/b/rxteam/archive/2013/12/13/rxjs-2-2-released.aspx。同时,也可以参考SignalR和Messaging的答案,它们都适用于您所描述的场景。 - Murray Foxcroft
谢谢!对于 SignalR,因为我有一个桌面应用程序,所以它使用长轮询技术对吧? - Badarinath Katti
SignalR 的正确使用非常高效。如果您想避免为许多客户端不断访问数据库,则可以在服务器上缓存结果。或者,让服务器每隔 5 分钟读取一次数据库状态,并向所有订阅浏览器发送消息,说明数据库仍然活动。 - Murray Foxcroft
嗨,我没有很多客户。只有一个桌面应用程序。我不想经常轮询数据库,即使每5分钟一次也是昂贵的,因为我需要轮询许多数据库。只是一个桌面应用程序和许多数据库。 - Badarinath Katti

0

所有这些服务都使用长轮询作为后备,对吧?除了长轮询之外,桌面应用程序还有其他选择吗? - Badarinath Katti
如果您使用Oracle,您可以创建在CRUD(插入、读取、更新、删除)时执行的触发器。对于TSQL,您可以创建除了任务之外还执行推送的过程。但是这不是独立于数据库的。 - Margus
我不明白。如果有触发器,我的前端应用程序如何知道?我的asp.net应用程序是否有一种方式可以知道某个触发器是否被触发?此外,我正在寻找特定插入的值..因此CRUD并不涵盖这一点.. - Badarinath Katti

0

我不知道你在处理什么或多少数据,所以除非你要查看的数据/数据库表比较少,否则这个答案可能需要做太多工作。

不要每5分钟拉取一组数据,而是在数据库中添加一个带有单个日期时间字段的表。然后在您想要监视的表上创建触发器(添加/编辑/删除/任何操作)。当触发器被触发时,它会更新您创建的表中的日期时间。

将您的桌面应用程序更改为仅每5分钟拉取该日期时间值,将该值缓存到某个地方并在每次轮询时进行比较,如果日期时间更改,则您的桌面应用程序可以触发所需的数据更新。


嗨..我有几百个数据库。我需要轮询每一个。这不是CRUD操作。我轮询某一列的特定值。如果该列的值是我要查找的内容,那么我才需要执行操作。 - Badarinath Katti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接