private void run() { while (!cancellationToken.IsCancellationRequested) { switch (State) { case APIState.Failing: //todo: replace this with a ping request. Thread.Sleep(5000); if (!isLoggedIn) { goto case APIState.Connecting; } break; case APIState.Offline: case APIState.Connecting: if (registrableUser != null) { handleRequest(registrableUser); registrableUser = null; continue; } if (!hasLogin) { State = APIState.Offline; Thread.Sleep(50); continue; } State = APIState.Connecting; int userID = 0; if (!hasValidToken && (userID = authenticate()) < 0) { Token = null; continue; } var userReq = new GetUserRequest(userID); userReq.Success += u => { LocalUser.Value = u; failureCount = 0; State = APIState.Online; }; if (!handleRequest(userReq)) { if (State == APIState.Connecting) { State = APIState.Failing; } continue; } while (State > APIState.Offline && State < APIState.Online) { Thread.Sleep(500); } break; } if (!hasValidToken) { Logout(); continue; } while (true) { APIRequest req; lock (queue) { if (queue.Count == 0) { break; } req = queue.Dequeue(); } handleRequest(req); } Thread.Sleep(50); } }
public void Register(AddUserRequest userRequest) { registrableUser = userRequest; }