Без реального запуска реального кода в трех примерах я не знаю, что могу дать авторитетный ответ, но мой совет - использовать # 2 и держаться подальше от # 1 и # 3.
Я пролистал источник для Silverlight Unit Test Framework Джеффа Уилкокса, и, насколько я помню, он использует умный, но действительно ужасный хак для EnqueueConditional, то есть он неоднократно вызывает предикат, переданный EnqueueConditional () в таймер / фоновый поток, проверяющий каждый раз, чтобы увидеть, если он возвращает истину. (Это не то, что вы хотите в производственном коде, но это достаточно хорошо для тестовой среды - логика, я полагаю.)
Так что, если ваш тест занимает пару секунд, я бы ожидал, что ваш waitHandler.WaitOne () any (a) будет вызываться много раз, блокируя каждый поток по ходу; или (b) заблокировать поток, который, как предполагается, может делать и другие вещи. Я предполагаю, что (с) также возможен, то есть вам может повезти, что WaitOne () не заблокирует ничего важного и будет вызван только один раз. Но, безусловно, # 2 - это «стандартный» способ использования этой тестовой среды, и если бы у вас не было конкретной причины представить более сложную логику WaitHandle, я бы не попытался подтолкнуть тестовую среду в этом направлении.
Тем не менее, если кто-то захочет осмотреться и дать более авторитетный ответ, я весь в ушах: -).