//APM implementation of BeginCheckDeviceVersion public IAsyncResult BeginCheckDeviceVersion(Services svc, int devId, AsyncCallback cb, object state) { AsyncCallback onGetDeviceAddress = null, onGetVersionFromDevice = null, onGetStoredVersion = null; var gar = new GenericAsyncResult <bool>(cb, state, false); int stateCount = 2; //to control completion int devVer = -1, stoVer = -1; onGetDeviceAddress = (_ar) => { string devAddr = svc.EndGetDeviceAddress(_ar); svc.BeginGetVersionFromDevice(devAddr, onGetVersionFromDevice, null); }; onGetVersionFromDevice = (_ar) => { devVer = svc.EndGetVersionFromDevice(_ar); if (Interlocked.Decrement(ref stateCount) == 0) { gar.SetResult(devVer == stoVer); } }; onGetStoredVersion = (_ar) => { stoVer = svc.EndGetStoredVersion(_ar); if (Interlocked.Decrement(ref stateCount) == 0) { gar.SetResult(devVer == stoVer); } }; svc.BeginGetDeviceAddress(devId, onGetDeviceAddress, null); svc.BeginGetStoredVersion(devId, onGetStoredVersion, null); return(gar); }
private IAsyncResult BeginListen(TcpListener server, Logger logger, CancellationToken cToken, AsyncCallback acb, object state) { GenericAsyncResult <bool> gar = new GenericAsyncResult <bool>(acb, state, false); int activeConnections = 0; TcpClient tcpClient = null; server.BeginAcceptTcpClient(onAcceptClient, null); void onAcceptClient(IAsyncResult ar) { tcpClient = server.EndAcceptTcpClient(ar); if (!cToken.IsCancellationRequested && Interlocked.Increment(ref activeConnections) < MAX_ACTIVE_CONNECTIONS) { server.BeginAcceptTcpClient(onAcceptClient, null); } BeginHandlerRunner(tcpClient, logger, onHandlerRunner, null); } void onHandlerRunner(IAsyncResult ar) { if (!cToken.IsCancellationRequested && Interlocked.Decrement(ref activeConnections) == MAX_ACTIVE_CONNECTIONS - 1) { server.BeginAcceptTcpClient(onAcceptClient, null); } else if (cToken.IsCancellationRequested && Interlocked.Decrement(ref activeConnections) == 0) { tcpClient.Close(); gar.SetResult(true); } } return(gar); }
// Fake implementation of the Services interface methods public IAsyncResult BeginGetDeviceAddress(int devId, AsyncCallback callback, object state) { GenericAsyncResult <String> ar = new GenericAsyncResult <String>(callback, state, false); new Timer((_) => ar.SetResult("device42"), null, 1000, Timeout.Infinite); return(ar); }
public IAsyncResult BeginGetStoredVersion(int devId, AsyncCallback callback, object state) { GenericAsyncResult <int> ar = new GenericAsyncResult <int>(callback, state, false); new Timer((_) => ar.SetResult(42), null, 200, Timeout.Infinite); return(ar); }
public IAsyncResult BeginGetVersionFromDevice(String addr, AsyncCallback callback, object state) { GenericAsyncResult <int> ar = new GenericAsyncResult <int>(callback, state, false); new Timer((_) => ar.SetResult(42), null, 100, Timeout.Infinite); return(ar); }
IAsyncResult Service.BeginFindId(String name, String bdate, AsyncCallback cb, Object st) { GenericAsyncResult <int> ar = new GenericAsyncResult <int>(cb, st, false); new Timer( (_) => ar.SetResult(42), null, new Random(Environment.TickCount).Next(1000), Timeout.Infinite ); return(ar); }
IAsyncResult Service.BeginObtainAvatarUri(int userId, AsyncCallback cb, Object st) { GenericAsyncResult <Uri> ar = new GenericAsyncResult <Uri>(cb, st, false); new Timer( (_) => ar.SetResult(new Uri("http://google.com")), null, new Random(Environment.TickCount).Next(1000), Timeout.Infinite ); return(ar); }
public static IAsyncResult BeginGetUserAvatar(Service svc, string name, string bdate, AsyncCallback cb, object state) { GenericAsyncResult <Uri> gar = new GenericAsyncResult <Uri>(cb, state, false); AsyncCallback onObtainAvatarUri = (_ant) => { var uri = svc.EndObtainAvatarUri(_ant); gar.SetResult(uri); }; AsyncCallback onFindId = (_ant) => { int id = svc.EndFindId(_ant); svc.BeginObtainAvatarUri(id, onObtainAvatarUri, null); }; svc.BeginFindId(name, bdate, onFindId, null); return(gar); }
public IAsyncResult BeginExecOnNearServer <S, R>(IAPMServices <S, R> s, Uri[] servers, S service, AsyncCallback ac, object state) { GenericAsyncResult <R> gar = new GenericAsyncResult <R>(ac, state, false); int got = 0, failures = 0; for (int i = 0; i < servers.Length; i++) { s.BeginPingServer(servers[i], onPingServer, null); } void onPingServer(IAsyncResult ar) { try { Uri uri = s.EndPingServer(ar); if (Interlocked.Exchange(ref got, 1) == 0) { s.BeginExecService(uri, service, onExecService, null); } } catch (Exception ex) { if (Interlocked.Increment(ref failures) == servers.Length) { gar.SetException(ex); } } } void onExecService(IAsyncResult ar) { try { gar.SetResult(s.EndExecService(ar)); } catch (Exception ex) { gar.SetException(ex); } } return(gar); }