public void Stop() { if (_completationConfirm.Task.Status == TaskStatus.Running) { _completationConfirm?.SetCanceled(); } _completationConfirm = null; if (_cts == null) { throw new InvalidOperationException(); } if (State != NetworkServiceState.Stoped) { State = NetworkServiceState.Stoped; _cts.Cancel(); _cts = null; } }
public async void Start() { if (State == NetworkServiceState.Stoped && _cts == null) { _completationConfirm = new TaskCompletionSource <ConfirmationResult>(); _cts = new CancellationTokenSource(); State = NetworkServiceState.Started; await TaskLoop(_cts.Token); } else { throw new InvalidOperationException(); } // todo: start scheduler // tcp listener separate task // if no connections // _table.for try to connect // stop if tcplistener.connected // get task definition -> call TaskCreated // wait for Confirm or Cancel, if disconnected, then back to listen and tell TaskDestroyed }
private async Task TaskLoop(CancellationToken ct) { try { while (!ct.IsCancellationRequested) { State = NetworkServiceState.Finding; var result = await _netService.WaitForOneConnection(ct); var connection = result.Key; var commingType = result.Value; var writer = new BinaryWriter(connection.GetStream()); var reader = new BinaryReader(connection.GetStream()); if (commingType == ConnectionCommingType.FromListen) { var jsontask = reader.ReadString(); var task = JsonConvert.DeserializeObject <CreatedNetworkTaskData>(jsontask); TaskCreated?.Invoke(this, new DataEventArgs <CreatedNetworkTaskData>(task)); } else { //todo: generate task... var task = new CreatedNetworkTaskData() { Frequency = 33100, FrequencyNumber = new Random().Next(0, 10), Id = Guid.NewGuid() }; var jsontask = JsonConvert.SerializeObject(task); writer.Write(jsontask); writer.Flush(); TaskCreated?.Invoke(this, new DataEventArgs <CreatedNetworkTaskData>(task)); } State = NetworkServiceState.RequestForConfirm; var remoteConfirm = TaskEx.Run(() => { var confirmationResult = reader.ReadString(); var isConfirmed = JsonConvert.DeserializeObject <ConfirmationResult>(confirmationResult); return(isConfirmed); }); var localConfirm = _completationConfirm.Task.ContinueWith(t => { var cjs = JsonConvert.SerializeObject(t.Result); writer.Write(cjs); writer.Flush(); return(t.Result); }, TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.NotOnCanceled); var bothConfirmation = await TaskEx.WhenAll(remoteConfirm, localConfirm); bool isBothConfimed = bothConfirmation.All(x => x.Result); if (isBothConfimed) { TaskStarted?.Invoke(this, new DataEventArgs <CreatedNetworkTaskData>()); } connection.Close(); } } catch (TaskCanceledException) { } catch (Exception ex) { SimpleLogger.Log(ex); } }