In the asynchronous programming model, there looks to be 4 ways (As stated in Calling Synchronous Methods Asynchronously) for making asynchronous method calls.
Calling the EndInvoke() method makes the calling thread wait for the method completion and returns the result.
Going through the IAsyncResult.AsyncWaitHandle.WaitOne() also seem to do the same. AsyncWaitHandle gets a signal of completion (In other word the main thread waits for the Asynchronous method’s completion). Then we can execute EndInvoke() to get the result.
-
What is the difference between calling the EndInvoke() directly and calling it after WaitOne()/WaitAll()?
-
In the polling technique we provide time for other threads to utilize the system resources by calling Thread.Sleep().
Does AsyncWaitHandle.WaitOne() or EndInvoke() make the main thread go on sleep while waiting?
Q1. There is no difference in the way your code runs or your application, but there might be some runtime differences (again not sure, but a guess based my understanding of
Async delegates).WaitAll()orWaitAny()if you dont have this synchronization need you shouldn’t readAsyncWaitHandleproperty. Reason :AsyncWaitHandledoesnt have to be implemented (created) by the delegate while running asynchronously, until it is read by the external code. I’m not sure of the way CLR handles the Async delegates and whether it creates a WaitHandler or not, but ideally if it can handle running your async delegates without creating another WaitHandle it will not, but your call to WaitOne() would create this handle and you have extra responsibility of disposing(close) it for efficient resource release. Therefore recommendation would be when there is no sycnchronization requirement which can be supported withWaitAll()orWaitAny()dont read this property.Q2. This Question answers the difference between Sleep and Wait.