2017-10-04 69 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 –

相關問題