2009-11-12 3 views
1

데이터베이스에 대한 액세스를 제공하는 타사 라이브러리를 사용하고 있습니다. 데이터베이스 연결 개체에는 데이터베이스가 수정 될 때마다 발생하는 Updated이라는 이벤트가 있습니다.다른 스레드로 이벤트 알림 이동

대리인이 데이터베이스에서 읽으려고 할 때 방해가됩니다. 연결에는 데이터베이스를 보호하는 ReaderWriterLock이있는 것 같습니다. ExecuteNonQuery 호출 중에 작성자 잠금이 수행되지만 이벤트가 시작되기 전에 해제되지 않습니다. 그래서, 만약 내가 읽고 싶으면 내 대의원에서 교착 상태에 빠졌습니다.

데이터베이스 연결에서 이벤트를 가져 와서 등록 된 대리자에게 전달하는 별도의 스레드를 작성하기 시작했으나 엉뚱한 해결책으로 느껴졌습니다. 이 문제를 해결할 수있는 쉬운 방법이 없습니까?

정말로 나를 괴롭히는 것은 항상 교착 상태가 발생하지 않는다는 것입니다. 그러나 내가 그것을 명중하고 콜 스택을 볼 때, 그것은 내가 업데이트를 발행 한 시점까지 완전히 도달한다.

그건 그렇고, 내가 사용하는 라이브러리는 System.Data.SQLite입니다.

답변

1

업데이트 된 이벤트에서 ThreadPool.QueueUserWorkItem()을 호출하고 현재 업데이트 된 이벤트 콜백의 논리가있는 메서드를 전달합니다.

+0

멋진 접근 방식입니다 ... 왜이 데이터베이스 문제를 처리하는 것뿐만 아니라 모든 이벤트를 전달하는 데이 방법을 사용하면 안되는 이유가 있습니까? – jheddings

+0

코드가 스레드로부터 안전한지 확인해야하기 때문에 응용 프로그램이 Windows Forms 또는 WPF 기반 인 경우 UI 스프레드 시트를 다른 스레드에서 업데이트 할 수 없으므로 복잡합니다. 그러나 이벤트 처리기를 호출 할 때 차단하지 않아야하는 작업을 수행 할 때는 비동기 처리와 같은 방법을 사용하는 것이 좋습니다. –

+1

그게 바로 Control.Invoke입니다. http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx – Gonzalo

관련 문제