One of the warning signs for bad multi threaded code is calling code that you don’t own while holding a lock. I just discovered a bug in NH Prof that is related to just that issue.
But I wasn’t really stupid, and the story of this bug is a pretty interesting one.
Let us look at what happened. I have a deadlock in the application, where two threads are waiting for one another. In the UI thread, I have:
And on a background thread, I have:
This is actually code that happen in two separate classes. And it sounded very strange, until I walked up the stack and found:
All nice and tidy, and it looks good. Except that Sessions.Add invoke the SessionsCollectionChanged, which perform a block UI call, while the UI is trying to enter a lock that is currently being held.
Like I said, this is a classic threading issue, but it is pretty hard to see, unless you can actually get the stack trace.