Вот что, вероятно, происходит:
- Поток 1: получает EndInvoke ();
ожидая выполнения делегата в
поток графического интерфейса.
- Поток GUI: блокируется в
System.Diagnostics.Trace.WriteLine
где-то (афаик трассировочная система
использует замки, чтобы быть потокобезопасным.)
- Поток 1: будет заблокирован навсегда, поскольку поток GUI заблокирован и не может завершить выполнение делегата.
Вызов только Invoke, скорее всего, не решит проблему, так как Invoke блокирует, пока не завершится работа делегата.
Вызов только BeginInvoke должен решить проблему блокировки, BeginInvoke просто инициирует асинхронный вызов потока GUI, не дожидаясь его завершения, покидая систему трассировки и разблокируя поток GUI. (Хотя я не уверен, что не стоит вызывать EndInvoke.