There have been reports of Control.Invoke hanging after the method completes. This was reported by a few customers and we have fixed this. For your reference:
ID: SRX050308605416
KB Article: 896665
The problem stems from some of the errors I describe in my previous post. IsCompleted will be "true", but the AsyncWaitHandle will never be set. The fix will be included in our next service pack.
A few workarounds exist:
1. Use a timeout in a loop checking IsComplete. Such as:
while (!result.IsCompleted) {
result.AsyncWaitHandle.WaitOne(200, false);
}
2. Access AsyncWaitHandle and call Thread.MemoryBarrier() before checking IsComplete
WaitHandle handle = result.AsyncWaitHandle;
Thread.MemoryBarrier();
if (!result.IsCompleted) {
handle.WaitOne();
}
instead of:
if (!result.IsCompleted) {
result.AsyncWaitHandle.WaitOne();
}
Both of these workarounds should work. The first has a minor perf implication.
Props to Jack Cheng at VideoTechnics for helping to correct the second fix.