I can't figure out how to quote just one small section of your code block, so...
The section where you use messageDictionary.ContainsKey, Add, then [ ] operators can be condensed into a slightly more efficient form:
Queue<string> queue;
if (!messageDictionary.TryGetValue(so.epFrom, out queue)
{
messageDictionary.Add(so.epFrom, queue = new Queue<string>());
}
queue.Enqueue(so.message);
This is a pretty common pattern in C#.
If you're using newer versions of C#, you can also say "out var queue" instead of defining the variable above TryGetValue.