I'm trying to use named pipes for the first time. In the MS documentation found here, it states that:
EndWaitForConnection must be called exactly once for every call to BeginWaitForConnection.
So I'm trying to be a good little programmer and follow documentation, but the EndWaitForConnection()
just hangs indefinitely when I use it.
So I stripped down my code to a bare minimum so see if I could isolate the problem but no dice. I've pulled the following code out of a class I've written. I've modified it so that it begins waiting on a pipe connection then immediately tries to stop waiting on that pipe connection:
private void WaitForConnectionCallBack(IAsyncResult result)
{
}
public void Start()
{
var tempPipe = new NamedPipeServerStream("TempPipe",
PipeDirection.In,
254,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous);
IAsyncResult result = tempPipe.BeginWaitForConnection(
new AsyncCallback(WaitForConnectionCallBack), this);
tempPipe.EndWaitForConnection(result); // <----- Hangs on this line right here
}
1) Why does it hang on EndWaitForConnection()
? If I want to shut down my server before I've received a connection, how can I essentially cancel this BeginWaitForConnection()
callback?
2) Let's suppose that I did not have the above mentioned problem. What happens if 2 clients try to connect to my named pipe very quickly?
Do I get a callback invocation for each of them, or do I have to wait to receive the first connection notification then quickly call EndWaitForConnection()
then WaitForConnectionCallBack()
again to start listening for the next client again?
The latter seems like a race condition to me, because I may not set up the connection listener fast enough.
ObjectDisposedException
in the callback. Since when is handling an exception the "expected" way of doing things? I'm not saying you're wrong, but does this make sense? Is this the way it should work? – Your