c# - How to wait for a connection asynchronously? -


i've designed class wraps socket , allows sending , receiving through/from it. since accepting, sending , receiving done through ui, don't want them block used asynchronous versions.

here's relevant code:

public void accept() {      // ...      // resultaccept iasyncresult     resultaccept = listener.beginaccept(new asynccallback(acceptcallback), null); }  private void acceptcallback(iasyncresult ar) {     connectedsocket = listener.endaccept(ar); }  public string receive() {     char[] data = new char[128];      if (!resultaccept.iscompleted) // (1)         resultaccept.asyncwaithandle.waitone();      connectedsocket.beginreceive(encoding.utf8.getbytes(data), 0, data.length, socketflags.none,                                  new asynccallback(recvcallback), null);      // ... } 

when start receiving, since there's no connection yet, has wait 1 (1) , blocks ui (which, again, don't want).
in addition, when connection accepted nullreferenceexception because when beginreceive starts, acceptcallback is, yes triggered, has not completed yet connectedsocket still has initialized.

  1. why approach wrong?
  2. is possible achieve want async sockets?
  3. how can prevent ui blocking while waiting connection , ensuring validity of object?

  1. yes, because blocking. need throw away.
  2. yes, there socket extension methods on web adapt obsolete apm pattern tap pattern can use await. exercise becomes trivial then.

your code should like:

async task runserver() {  socket serversocket = ...;   while (true) {   runconnection(await serversocket.acceptasync());  } } 

and provide task runconnectionasync(socket s) function async well. simple once leave obsolete apm pattern alone.

alternatively, use threads , synchronous io. nothing wrong doing that. await little nicer, though, because marshals ui thread automatically.


Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -