【问题标题】:Replace BackgroundWorker polling database with Async/Await用 Async/Await 替换 BackgroundWorker 轮询数据库
【发布时间】:2014-04-16 23:10:41
【问题描述】:

我有一个 C# 类,它使用 BackgroundWorker 来轮询特定数据库表的更改。如果有什么变化,它会触发一个事件。此外,我有一个 Token 类,它有一个处理此事件的处理程序,它基本上将标记状态设置为“脏”。

现在我问自己是否有比每隔几毫秒轮询一次数据库更好的方法。我想在我的令牌中创建一个异步方法,比如

public async Task<bool> IsDirty()
{
    return await Something();
}

但是我应该在这里等待什么?我的 BackgroundWorker 只有它的 Do_Work 和 RunWorkerCompleted 方法。 BackgroundWorker 不需要一直检查,但至少在有人调用/等待 IsDirty() 方法时是这样。

【问题讨论】:

  • 考虑用 Task 替换 BackgroundWorker。

标签: c# asynchronous polling


【解决方案1】:

是的,肯定有比轮询数据库更好的方法。 Using SqlDependency in a Windows Application

您可以创建一个依赖对象,SQL Server 会在其中通知您发生了某些变化(插入、更新、删除的记录)。

【讨论】:

  • 我知道 SqlDependency,但它使我的应用程序非常慢,因为它在执行查询时阻塞并且我没有可能使执行调用异步。检查更大的查询(例如 2 个或更多连接)时,最多需要 2 秒。这就是我围绕 SQL Server 的更改跟踪功能构建此包装器以轮询 CHANGETABLE() 函数的原因。
猜你喜欢
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多