【问题标题】:looking for the best way to see when my task is complete C#寻找查看我的任务何时完成的最佳方法 C#
【发布时间】:2018-04-23 22:26:25
【问题描述】:

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

我已经探索了 .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);
            }
        }

【问题讨论】:

  • 另外请做一个完整且尽可能简短的示例,这将代表您的问题。我真的不想深入研究这段代码。
  • 也许使用System.Threading.Tasks Namespace 取决于你想要达到的目标..
  • 或者添加一个 Finaly 到那个 TryCatch 块并在最后打印“完成”,播放声音,连接一个发射火箭的外部设备.. 我真的不知道你的意思是“ ...查看我的任务何时完成的最佳方式..." :p 然后你可以看到
  • 叫我盲人 - 我在你的代码中看不到任何任务
  • @BugFinder 你发现了一个错误:p

标签: c# task


【解决方案1】:

对于任务,您可以同时启动多个任务并等待它们全部完成,如下所示:

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

【讨论】:

  • 好的,这就是我想要的,但这就是它变得更加困难的地方,因为我需要最后的过程来告诉任务它已完成,并且当它再次触发以将其标记为未完成时,直到它再次完成并标记为完成。基本上相同的任务一遍又一遍地运行,但任务是调用嘿,我不完整,嘿,我完成了语句。
  • 你能给我一些关于如何设置我的工作来完成这项任务的文档吗?
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2019-10-26
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多