2017-10-04 66 views
0

因此,我拉入项目列表,并为每个项目创建一个对象实例以在该项目上运行任务。所有对象都是相同的,它们每三秒钟根据收到的消息进行更新。这个更新不是一次全部发生,有时需要3.1秒等等。这是我需要用XML序列化的数据,一旦它全部存在,我正在寻找一种方法来查看它的全部完成情况。寻找最佳方式来查看我的任务完成时间C#

我已经探究过.net 4.6中的任务,但它启动了一个任务,它报告完成,然后再次运行任务类将再次启动它,但在我的情况下,将无法工作,因为每个实例保持活动并启动本身当一个新的消息进来。

什么是让它报告它到达最后一行代码,然后看看这些实例的列表,并说当他们全部显示为完成然后运行任务连载?

我已经包含正在运行的实例的以下代码。

private void OnMessageReceived(object sender, MessageReceivedEventArgs e) 
     { 
      var eventArgs = new CallDataReceivedEventArgs(); 
      this.OnCallDataReceived(eventArgs); 

      try 
      { 
       List<Tuple<String, TimeSpan>> availInItems = new List<Tuple<string, TimeSpan>>(); 
       List<Tuple<string, int, TimeSpan, string, string, string>> agentlist = new List<Tuple<string, int, TimeSpan, string, string, string>>(); 

       if (e == null) 
       { 
        return; 
       } 

       List<TimeSpan> listOfTimeSpans = new List<TimeSpan>(); 
       if (e.CmsData != null) 
       { 
        #region Gathering Agent Information 
        // Create a list of all timespans for all _agents in a queue using the property AgentTimeInState 

        foreach (var item in e.CmsData.Agents) 
        { 
         //AgentData = new ScoreBoardAgentDataModel(AgentName, AgentExtension, AgentTimeInState, AgentAuxReason, AgentId, AgentAdcState); 

         _agentData.AgentName = item.AgName; 

         _agentData.AgentExtension = item.Extension; 

         _agentData.AgentAuxReason = item.AuxReasonDescription; 

         _agentData.AgentId = item.LoginId; 

         _agentData.AgentAcdState = item.WorkModeDirectionDescription; 

         _agentData.AgentTimeInState = DateTime.Now - item.DateTimeUpdated; 

         _agentData.TimeSubmitted = DateTime.Now; 

         agentlist.Add(Tuple.Create(_agentData.AgentName, _agentData.AgentExtension, _agentData.AgentTimeInState, _agentData.AgentId, _agentData.AgentAcdState, _agentData.AgentAuxReason)); 

         if (_agentData.AgentAcdState == "AVAIL") 
         { 
          listOfTimeSpans.Add(_agentData.AgentTimeInState); 

          availInItems.Add(Tuple.Create(_agentData.AgentName, _agentData.AgentTimeInState)); 
         } 

         availInItems.Sort((t1, t2) => t1.Item2.CompareTo(t2.Item2)); 
        } 

        var availInAgents = 
         agentlist 
          .Where(ag => ag.Item5 == "AVAIL") 
          .ToList(); 

        availInAgents.Sort((t1, t2) => 
         t1.Item3.CompareTo(t2.Item3)); 

        var max3 = availInAgents.Skip(availInAgents.Count - 3); 

        max3.Reverse(); 

        _agents.AgentsOnBreak = 0; 
        foreach (var agent in agentlist) 
        { 
         if (!string.IsNullOrEmpty(agent.Item6) && agent.Item6.StartsWith("Break")) 
         { 
          _agents.AgentsOnBreak++; 
         } 
        } 

        _agents.AgentsOnLunch = 0; 
        foreach (var agent in agentlist) 
        { 
         //If the current agent's aux reason is Lunch 
         if (!string.IsNullOrEmpty(agent.Item6) && agent.Item6.StartsWith("Lunch")) 
         { 
          //add one to agentsonlunch 
          _agents.AgentsOnLunch++; 
         } 
        } 

        _agents.NextInLine = string.Empty; 
        foreach (var agent in max3.Reverse()) 
        { 
         //assign agent to NextInLine and start a new line 
         _agents.NextInLine += agent.Item1 + Environment.NewLine; 
         //reverse NextInLine 
         _agents.NextInLine.Reverse(); 
        } 

        _agents.TimeSubmitted = DateTime.Now; 

        #endregion 

        #region Gathering Skill Information 

        _skillData.OldestCall = e.CmsData.Skill.OldestCall; 
        _skillData.AgentsStaffed = e.CmsData.Skill.AgentsStaffed; 
        _skillData.AgentsAuxed = e.CmsData.Skill.AgentsInAux; 
        _skillData.AgentsAvailable = e.CmsData.Skill.AgentsAvailable; 
        _skillData.AgentsOnCalls = e.CmsData.Skill.AgentsOnAcdCall; 
        _skillData.CallsWaitingInQueue = e.CmsData.Skill.InQueueInRing; 
        _skillData.Asa = e.CmsData.Skill.AnswerTimePerAcdCall; 
        _skillData.TimeSubmitted = DateTime.Now; 
        _skillData.EstimatedHoldTimeLow = e.CmsData.Skill.ExpectedWaitTimeLow; 
        _skillData.EstimatedHoldTimeMedium = e.CmsData.Skill.ExpectedWaitTimeMedium; 
        _skillData.EstimatedHoldTimeHigh = e.CmsData.Skill.ExpectedWaitTimeHigh;  
        #endregion 

       } 
      } 
      catch (Exception ex) 
      { 
       _logger.Info(ex.Message, ex); 
      } 
     } 
+2

还请一个完整的,尽可能短的例子,这将代表您的问题。我真的不想深入这个代码。 – SeM

+0

也许使用[System.Threading.Tasks命名空间](https://msdn.microsoft.com/en-us/library/system.threading.tasks(v = vs.110).aspx)类型取决于你想要什么实现.. – rmjoia

+0

或添加Finaly到该TryCatch块,并在终于打印“完成”,播放声音,连接启动火箭的外部设备..我真的不知道你的意思是“...最好的方式来看看我的任务完成......“:p然后你可以看到 – rmjoia

回答

3

有了任务,你可以在同一时间启动多个,并等待他们全部完成这样的:

var taskList = new List<Task>(); 

foreach (var thingToDo in work) 
{ 
    taskList.Add(thingToDo.StartTask()); 
} 

Task.WaitAll(taskList.ToArray()); 

这种方式,您可以并行运行的一切,不会得到最后一行之后才一切都完成了。

编辑您的评论

你可以用这个嵌入您在任务的工作如下:

public async Task DoWork() 
{ 
    var taskList = new List<Task>(); 

    foreach (var thingToDo in work) 
    { 
     taskList.Add(thingToDo.StartTask()); 
    } 
    await Task.WhenAll(taskList.ToArray()); 
} 
+0

好吧,这是我想要的,但这是它变得更加困难的地方,因为我需要最后的过程来告诉任务完成,并且当它再次触发时将它标记为不完整,直到它再次完成并标记为完成。基本上相同的任务一遍又一遍地运行,但任务是调用嘿,我不完整,嘿,我是完整的声明。 – funktail1989

+0

你能指点我一些关于如何设置我的工作来处理这个任务的文档吗? – funktail1989

+0

这会帮助你吗? https://www.dotnetperls.com/async –

相关问题