When it comes to asynchronous events and network operations, you shouldn't expect things to always be the same on different devices, or even on the same device from run to run. The network connection timing can be different, the processor speed or number of processors can be different, different background processing can be going on, etc.
I can't guess specifically on what you're seeing, but the code that does a single Wait call isn't really correct. Maybe it's taking longer than a second, or it's getting interrupted before the timeout for some reason. Did you try setting the timeout to a larger value such as 5 seconds or more, to see if that made any difference?
I don't know if your code is just sample code, because it is assuming that AsyncGetToString is going to work the same as synchronous GetToString, which you wouldn't generally want in real channel code.
Usually, you will have a loop that is polling the message port in your application event processing or task. And if Wait returns an invalid, it should just loop and wait again. Then, rather than using a fixed small timeout like that, you might want to wait with 0 so it wakes up just when necessary, or if you want it to poll it every second, at least keep retrying and use a separate time counter if you really need special timeout behavior.
Hope that helps.