wpf 处理耗时的工作利用 BrackgroundWorder

来源:互联网 发布:水果软件中文版 编辑:程序博客网 时间:2024/05/20 20:19

   var bw = new System.ComponentModel.BackgroundWorker();

  bw.DoWork += (s, e) =>
            {
                foreach (var item in items)
                {
                    Packet packet = new Packet();
                    Body body = new Body();
                    packet.Read(item.RawData);
                    body.Read(packet.Body);

                    var terminalNo = body.TerminalNo;

                    var carrier = carriers.Where(x => x.Key == body.TerminalNo);
                    if (carrier == null || carrier.Count() == 0) continue;
                    var alarm = Csla.Core.ObjectCloner.Clone(carrier.First().Value) as CarrierPosition;
                    alarm.ProcessPositionData(body);
                    alarm.ID = item.ID;
                    alarm.AlarmProcessStatus = item.ProcessStatus;
                    cp.Add(alarm);
                }
                       e.Result = cp;

            };

            bw.RunWorkerCompleted += (s, e) =>
            {
                try
                {
                     CarrierPositions cps = e.Result as CarrierPositions;
                    if (cps != null)
                    {
                        _StepTimer = new System.Threading.Timer(new System.Threading.TimerCallback(addalarmsToMonitor), null, 10, 500);
                    }
                    cplist = cps.OrderByDescending(x => x.LocalTime).Take(500).ToList<CarrierPosition>();

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            };
            bw.RunWorkerAsync();

 

           private void addalarmsToMonitor(object state)
        {
            this.Dispatcher.BeginInvoke((Action)delegate()
            {
                try
                {
                        if (cplist == null) return;
                    if (cplist.Count() > 10)
                    {
                        _RealtimemonitorViewModel.Model.Alarms.AddRange(cplist.Take(10));

                        cplist = cplist.Skip(10).ToList<CarrierPosition>();
                    }
                    else
                    {
                        _RealtimemonitorViewModel.Model.Alarms.AddRange(cplist);
                        _RealtimemonitorViewModel.Model.AlarmsCount = _RealtimemonitorViewModel.Model.Alarms.Count();
                        cplist = null;
                        _StepTimer.Dispose();
                        _StepTimer = null;

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }

            });
        }