예제 #1
0
        public virtual async void OnAttachServer(NamedPipeServerStream server)
        {
            await Task.Run(() => server.WaitForConnection()); //偷懒

            using (StreamReader reader = new StreamReader(server))
            {
                using (StreamWriter writer = new StreamWriter(server))
                {
                    _pipes.Add(server, new KeyValuePair<StreamReader, StreamWriter>(reader, writer));
                    while (server.IsConnected)
                    {
                        try
                        {
                            var req = JsonConvert.DeserializeObject<NewTaskRequest>(reader.ReadLine());
                            TimePlan plan = new TimePlan(req.Describe, req.leftTime);
                            _callbackPipe.Add(plan, server);
                            plan.TimePlanExpired +=
                                (sender, args) =>
                                    _pipes[_callbackPipe[args.CurrentPlan]].Value?.Write(
                                        new TaskCompletePostBack(args.CurrentPlan.Description, args.CurrentPlan.EndTime));
                            _timePlans.AddSafe(plan);
                        }
                        catch (Exception)
                        {
                            break;
                        }
                    }
                    _pipes.Remove(server);
                }
            }
        }
예제 #2
0
        private void TaskEditor_OnLoaded(object sender, RoutedEventArgs e)
        {
            
            if (CurrentPlan == null) CurrentPlan = _tempPlan = new TimePlan(0, "", TimeSpan.Zero, DateTime.Now, DateTime.Now);
            else
            {
                if (CurrentPlan.IsProtected)
                {
                    Close();
                }
                while (CurrentPlan.IsLocked)
                {
                    //DO NOTHING!!!
                }
                CurrentPlan.IsLocked = true;
                _tempPlan = new TimePlan(CurrentPlan);
            }
            _tempPlan.PropertyChanged += (o, args) => Dispatcher.Invoke(() =>
            {
                if (_tempPlan.LeftTime == TimeSpan.Zero)
                {
                    _tempPlan.CopyData(CurrentPlan);
                    return;
                }
                try
                {
                    DateTime.Parse(TxbJoinTime.Text);
                    DateTime.Parse(TxbEndTime.Text);
                }
                catch (FormatException)
                {
                    _tempPlan.CopyData(CurrentPlan);
                    return;
                }
                catch (ArgumentNullException)
                {
                    _tempPlan.CopyData(CurrentPlan);
                    return;
                }


                switch (args.PropertyName)
                {
                    case "AddTime":
                        if (_tempPlan.AddTime > _tempPlan.EndTime)
                        {
                            _tempPlan.EndTime = _tempPlan.AddTime;
                        }
                        else
                        {
                            _tempPlan.LeftTime = _tempPlan.EndTime - _tempPlan.AddTime;
                        }
                        break;
                    case "EndTime":
                        if (_tempPlan.AddTime > _tempPlan.EndTime)
                        {
                            _tempPlan.AddTime = _tempPlan.EndTime;
                        }
                        else //防止发生递归
                        {
                            _tempPlan.LeftTime = _tempPlan.EndTime - _tempPlan.AddTime;
                        }
                        break;
                    case "LeftTime":
                        if (_tempPlan.EndTime == _tempPlan.AddTime + _tempPlan.LeftTime)
                            return;//防止发生递归
                        _tempPlan.EndTime = _tempPlan.AddTime + _tempPlan.LeftTime;
                        break;
                }

            });
            InputGrid.DataContext = _tempPlan;
        }