Is this a good way to syncronize my Threads?
When I tried to measure the delay of AutoResetEvent, I usually got less than 0.1 ms. That doesn't sounds like something you should worry about. If you're seeing larger delay, maybe it's caused by something else. It could be processing the message queue, which is what RenderLoop does between calls to Run().
Calling Set() before you enqueue the item is wrong, because it has a race condition: the dequeuing thread could wake up and call TryDequeue() before you call Enqueue().
In fact, the whole way you're using AutoResetEvent is wrong. If two items are enqueued quickly, then only one of them will be dequeued. Actually, this could be what's causing the delay you see, because it means there could be an ever-growing number of items in the queue just waiting for no good reason.
A better way to write your code would be to use BlockingCollection&lt;T&gt; instead of ConcurrentQueue&lt;T&gt; (which I assume you're using now) and AutoResetEvent.
It might be more efficient to dequeue more than one item from the queue in each call to Run(), if they are available. But probably only a limited amount, to make sure the message queue is processed too.