C# 将事件通知移动到另一个线程

C# 将事件通知移动到另一个线程,c#,multithreading,events,C#,Multithreading,Events,我正在与第三方图书馆合作,该图书馆提供对数据库的访问。在数据库连接对象中,有一个名为Updated的事件,每当修改数据库时都会触发该事件 当我的代理想要从数据库中读取数据时,我遇到了一个障碍。连接似乎有一个读写器锁保护数据库。在调用ExecuteNonQuery期间,会获取写入程序锁,但不会在事件触发之前释放。所以,如果我想阅读,我的代表就陷入了僵局 我开始编写一个单独的线程,从数据库连接获取事件并将其传递给已注册的代理,但这感觉像是一个草率的解决方案。我是否错过了处理这个问题的简单方法 真正让

我正在与第三方图书馆合作,该图书馆提供对数据库的访问。在数据库连接对象中,有一个名为
Updated
的事件,每当修改数据库时都会触发该事件

当我的代理想要从数据库中读取数据时,我遇到了一个障碍。连接似乎有一个
读写器锁
保护数据库。在调用
ExecuteNonQuery
期间,会获取写入程序锁,但不会在事件触发之前释放。所以,如果我想阅读,我的代表就陷入了僵局

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

真正让我烦恼的是,我并不总是遇到僵局。但是,当我点击它并查看调用堆栈时,它会一直返回到我发布更新的位置


顺便说一下,我使用的库是。

在更新的事件中,调用ThreadPool.QueueUserWorkItem()并将当前更新的事件回调中的逻辑传递给它。

在更新的事件中,调用ThreadPool.QueueUserWorkItem()并将当前更新的事件回调中的逻辑传递给它。

Nice,这是一个简单的方法。。。有什么原因不应该只使用这个方法来调度所有事件(不仅仅是为了处理这个数据库问题)?因为你必须确保你的代码是线程安全的,如果你的应用程序是基于Windows窗体或WPF的(因为你不能从主线程以外的其他线程更新UI控件),这会使事情变得复杂。但是,当您在处理调用事件处理程序时不应该阻塞的事情时,这种异步处理就是一种方法。这就是Control.Invoke的用途@杰丁斯:这取决于你的活动是什么,以及你想什么时候完成。有时候你希望它们是同步的,其他的你不关心…很好,这是一个简单的方法。。。有什么原因不应该只使用这个方法来调度所有事件(不仅仅是为了处理这个数据库问题)?因为你必须确保你的代码是线程安全的,如果你的应用程序是基于Windows窗体或WPF的(因为你不能从主线程以外的其他线程更新UI控件),这会使事情变得复杂。但是,当您在处理调用事件处理程序时不应该阻塞的事情时,这种异步处理就是一种方法。这就是Control.Invoke的用途@杰丁斯:这取决于你的活动是什么,以及你想什么时候完成。有时候你希望它们是同步的,其他的你不在乎。。。