internal override void InternalWormHole(object obj) { //文件开始发送时,会调用这个函数。所以ProcessingItems里面存储的,是所有尝试开始过的Item,如果成功了,就会从里面移除,不管是主动发送完毕,还是对方已经有这个文件,直接变成完成状态。 //TODO 现在有个问题没有解决,获取正在等待确认的文件,或者出错的文件,是应该在这个ProcessingItems里面呢,还是应该去Items属性里面?因为这两个是重复的。 //作为临时的解决方案,可以查找ProcessingItems里面的Item的相对路径是不是"", 如果是,就不要显示,因为Items那里已经显示了。 //TODO 重构 有没有更好的解决方案?不要冒然删除ProcessingItems,因为Items属性只管理了顶层的文件、文件夹。嵌套的子文件在那里面查找不到。 if (obj is FileItem) { //这里的item可以是嵌套很深的文件。在构造requester的时候设置item的回调达不到这个效果,除非遍历子元素。 //文件等待确认或者出错,会转移到PendingItems里面去。会话会尽量完成能传输完毕的文件,传不成功的(出错或没有得到及时确认)会留在这里。 var fi = obj as FileItem; if (ProcessingItems.Find(i => { return(i.ID == fi.ID); }) != null || fi.TransferState == TransferState.Confirmed) { return; //如果滥用了InternalWormHole,这样可以避免一下,否则会导致事件被触发多次。 } ProcessingItems.Add(fi); fi.Confirmed += (o) => ProcessingItems.Remove(fi); fi.Completed += (o) => { if (fi.NeedConfirm) { fi.TransferState = TransferState.WaitingConfirm; } }; } }
public IHttpActionResult PostProcessingItems(ProcessingItems processingItems) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } db.ProcessingItems.Add(processingItems); try { db.SaveChanges(); } catch (DbUpdateException) { if (ProcessingItemsExists(processingItems.ProcessNumber)) { return(Conflict()); } else { throw; } } return(CreatedAtRoute("DefaultApi", new { id = processingItems.ProcessNumber }, processingItems)); }
public IHttpActionResult PutProcessingItems(string id, ProcessingItems processingItems) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (!id.Equals(processingItems.ProcessNumber)) { return(BadRequest()); } db.Entry(processingItems).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!ProcessingItemsExists(id)) { return(NotFound()); } else { throw; } } return(StatusCode(HttpStatusCode.NoContent)); }
public IHttpActionResult GetProcessingItems(string id) { ProcessingItems processingItems = db.ProcessingItems.Find(id); if (processingItems == null) { return(NotFound()); } return(Ok(processingItems)); }
//速度可以计算出来?用传送开始时间、传输的数据量,再用一个timer定时更新速度就可以了。更新总的速度,或者一个会话的速度都可以。 //public event Action<int> SpeedChanged; internal protected override void OnInitRequest() { SendItemsMessage message = new SendItemsMessage(Items); Items.ForEach(item => { if (item is FileItem) { ProcessingItems.Add(item); } }); PostMessage(message); }
public IHttpActionResult DeleteProcessingItems(int id) { ProcessingItems processingItems = db.ProcessingItems.Find(id); if (processingItems == null) { return(NotFound()); } db.ProcessingItems.Remove(processingItems); db.SaveChanges(); return(Ok(processingItems)); }
private bool ProcessItemExists(string caller) // Tjekker om processnummer eksisterer i forvejen. Om det passer med færdigvarenummer. { bool exists = true; if (FinishNumber == 0 || Processnumber.Equals("")) // Er der indtastet nul eller ingenting { //Warn about missing fields if caller is button if (caller.Equals("button")) { ShowMsg.ShowMessage("Indtast venligst processordrenummer og færdigvarenummer"); } exists = false; } else if (ProItem.FinishedItemNumber != FinishNumber || ProItem.ProcessNumber != Processnumber) // Er der bare én af indtastningerne, der ikke passer med lagret processItem { // Opretter et processingItem at sammenligne med. Et processingItem forsøges hentet fra databasen med det indtastede processNummer som ID ProcessingItems comparableProcessingItemFromDb = ComGeneric.GetOne <ProcessingItems, string>(Processnumber); ProItem = new ProcessingItems // Opretter nyt processingItem til lagret processingItem { FinishedItemNumber = FinishNumber, // Oprettes med indtastede oplysninger ProcessNumber = Processnumber }; if (comparableProcessingItemFromDb == null) // Er processingItem - hentet fra databasen - null? { if (!ComGeneric.Post(ProItem)) // Gemmer nyt processingItem i DB { //Warn about connection problem to DB ShowMsg.ShowMessage("Der er ikke forbindelse til serveren"); exists = false; } } else if (!comparableProcessingItemFromDb.FinishedItemNumber.Equals(ProItem.FinishedItemNumber)) // Er indtastet færdigvarenummer og processingitems færdigvarenummer (fra databasen) ens? { // Warn about conflicting ProcessItem ShowMsg.ShowMessage("Procesordrenummeret eksisterer i forvejen, men med et andet færdigvarenummer"); exists = false; } } return(exists); }
private SaveTapOperator() { for (int i = 0; i < TapOperatorMoments.Length; i++) // initialiserer objekter i listen TapOperatorMoments { TapOperatorMoments[i] = new TapOperatorMoment(); } for (int i = 0; i < FluidWeightControls.Length; i++) // initialiserer objekter i listen FluidWeightControls { FluidWeightControls[i] = new FluidWeightControl(this); } GenerateObjectsToBeSaved(); _saveToDbMethod = PostSaveMethod; SaveCommand = new RelayCommand(SaveCommandPush); AutoSaveTimer = new AutoSaveTimer(this); LiquidTankCommand = new RelayCommand <object>(LiquidTankCommandMethod); ProItem = new ProcessingItems(); ShowMsg = new ShowMsg(); CalculateAverageWeight(); CurrentFinishedItem = new FinishedItems(); }
protected internal override void OnMessageReceived(ConversationMessage message) { if (message is CancelItemMessage) { CancelItemMessage msg = message as CancelItemMessage; msg.Items.ForEach((o) => { var cutItem = Items.FirstOrDefault(d => d.ID == o.ID); if (cutItem != null) { cutItem.TransferState = TransferState.Canceled; } }); holder.Remove(msg.Items); } else if (message is ConfirmItemMessage) { Debug.WriteLine("ConfirmedItem msg count=" + (confirmMsgCount++)); var cm = message as ConfirmItemMessage; //若不复制,Confirmed中的移除动作报错。测试确认一下。 var tmpProcessingList = new List <Item>(ProcessingItems); //Console.WriteLine("Received a confirm message itemid=" + cm.ItemID); var item = tmpProcessingList.Find(i => i.ID == cm.ItemID); if (item != null) { //这个状态改变,会导致item从ProcessingItems中移除。 item.ForceComplete(TransferState.Confirmed); //移除动作是在同一线程中,移除完毕会进入这里。 if (ProcessingItems.Count() == 0) { //应该还需要做这个检查,有可能存在没有正在处理的文件,但其他也没法送,或者状态不对的情况。 if (Items.All(o => o.TransferState == TransferState.Confirmed)) { //所有文件成功发送完毕 Completed?.Invoke(this); } else { //该做什么?没有正在处理的Item,但也不是所有的Item状态都是Confirmed。出错了..., 如果给对方发了列表,对方马上就回复Confirm,也是0 } } else { if (tmpProcessingList.All(o => o.TransferState == TransferState.WaitConfirmTimeouted || o.TransferState == TransferState.Error)) { //处理列表中的东西,都是出错 / 等待确认超时的,没办法再处理了。报告错误。上层如果要重新发送,可以到ProcessingItem里面去取。 //TODO 只需检查ProcessingItems即可。需要确认一个文件出错,或者等待确认超时,传递到父目录没有? Errored?.Invoke(this); } } } } else if (message is ReceiveItemErrorMessage) { var rie = message as ReceiveItemErrorMessage; var item = ProcessingItems.FirstOrDefault(i => i.ID == rie.ItemID); if (item == null) { item = Items.Find(i => i.ID == rie.ID); } if (item != null) { item.ErrorCode = rie.ErrorCode; item.TransferState = TransferState.Error; } } }