Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
 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
 }
Exemplo n.º 3
0
        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);
            }
        }