【问题标题】:Moving event notification to another thread将事件通知移动到另一个线程
【发布时间】:2009-11-12 06:17:48
【问题描述】:

我正在使用提供对数据库的访问的第 3 方库。在数据库连接对象中,有一个名为Updated 的事件,只要数据库被修改就会触发。

当我的代表想要从数据库中读取数据时,我遇到了障碍。看起来连接有一个ReaderWriterLock 保护数据库。在ExecuteNonQuery 调用期间,写入器锁定被占用,但在事件触发之前未释放。所以,如果我想阅读,我的委托就陷入僵局了。

我开始编写一个单独的线程,该线程将从数据库连接中获取事件并将其传递给已注册的委托,但这感觉像是一个草率的解决方案。我是否缺少处理此问题的简单方法?

真正困扰我的是我并不总是遇到死锁情况。但是,当我点击它并查看调用堆栈时,它会一直回到我发布更新的位置。

顺便说一下,我使用的库是System.Data.SQLite

【问题讨论】:

    标签: c# multithreading events


    【解决方案1】:

    在 Updated 事件中,调用 ThreadPool.QueueUserWorkItem() 并向其传递一个方法,其中包含当前 Updated 事件回调中的逻辑。

    【讨论】:

    • 很好,这是一种简单的方法......我有什么理由不应该只使用这种方法来调度所有事件(不仅仅是处理这个数据库问题)?
    • 因为你必须确保你的代码是线程安全的,如果你的应用程序是基于 Windows 窗体或 WPF 的,它会使事情变得复杂(因为你不能从主线程之外的另一个线程更新 UI 控件线)。但是当你在处理调用事件处理程序时不应该阻塞的事情时,这种异步处理是要走的路。
    • 这就是 Control.Invoke 的用途。 msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
    • @jheddings:这取决于您的活动做什么以及您希望何时完成。有时你希望它们是同步的,而其他你不关心的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2012-12-29
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多