Removing this odd while(true) for checking the queue
It sounds like you are sleeping only to avoiding busy waiting on the queue too frequently.

How about following the suggestion in this SO answer:

https://stackoverflow.com/a/5014271/2268996

so that you use the blocking Take method in your worker with code like this:

while (true)
{
    UserMessage m = blockingQueue.Take();
    dataItems.add(m);
    RaisePropertyChanged(() =&gt; FilteredDataItems);
    ... (no need to sleep here)...
}


You will still have the while (true) but not the Thread.sleep(...) call. Will that work for your situation?