The accepted answer may be misleading depending on your point of view and the amount of thread safety you are trying to achieve. This answer is aimed at people who stumble upon this question after learning about streaming and concurrency:
It is true that locking at the output of the dictionary search (Client object) makes some of the code flows safe, but only the code that accesses this restored object inside the lock. In this example, it is possible that another thread deletes this object from the dictionary after the current thread receives it. (Although there are no instructions between the extract and lock, other threads can still execute between them.) Then this code will add the Client object to the Users list, even if it is no longer in the parallel dictionary. This may cause an exception, synchronization, or race condition.
It depends on what the rest of the program does. But in the scenario that I am describing, it would be safer to put a lock around the entire dictionary search. And then a regular dictionary can be faster and easier than a parallel dictionary if you always block it when using it!
source share