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); } } }
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; }