【问题标题】:Handle a function taking a lot of time Threading处理一个花费大量时间的函数
【发布时间】:2012-03-28 20:33:56
【问题描述】:

我有一个功能在 Web 应用程序中需要很长时间才能执行。

我已经用探查器和我的日志对此进行了测试。

我在同一个页面加载中运行其他功能。

显示这些函数的其余值并将此函数保存在线程中并在完成时将其显示在标签中的最佳方法是什么?

此函数用于获取应用程序中需要时间的事件。

private void getEventErrors()
    {
        EventLog eventLog = new EventLog("Application", ".");

        getEvents(eventLog.Entries);
    }

private void getEvents(EventLogEntryCollection eventLogEntryCollection)
    {
        int errorEvents = 0;

        foreach (EventLogEntry logEntry in eventLogEntryCollection)
        {
            if (logEntry.Source.Equals("XYZ"))
            {
                DateTime variable = Convert.ToDateTime(logEntry.TimeWritten);
                long eventTimeTicks = (variable.Ticks);
                long eventTimeUTC = (eventTimeTicks - 621355968000000000) / 10000000;

                long presentDayTicks = DateTime.Now.Ticks;
                long daysBackSeconds = ((presentDayTicks - 864000000000) - 621355968000000000) / 10000000;


                if (eventTimeUTC > daysBackSeconds)
                {
                    if (logEntry.EntryType.ToString() == "Error")
                    {
                        errorEvents = errorEvents + 1;
                    }                        
                }
            }
        }
        btn_Link_Event_Errors_Val.Text = errorEvents.ToString(GUIUtility.TWO_DECIMAL_PT_FORMAT);            
        if (errorEvents == 0)
        {
            lbl_EventErrorColor.Attributes.Clear();
            lbl_EventErrorColor.Attributes.Add("class", "green");
        }
        else
        {
            lbl_EventErrorColor.Attributes.Clear();
            lbl_EventErrorColor.Attributes.Add("class", "red");
        }
    }

我在页面加载事件中有 3 个函数,其中两个用于从数据库中获取值,另一个如上所示。

这两个函数都应该是服务调用吗?

我想要的是,页面应该快速加载,如果有一个功能需要很长时间,它应该在后台运行并在完成后显示,如果用户想要导航到新页面,它应该在进程中杀死它并继续前进。

【问题讨论】:

  • 如何将其移至它所属的服务并进行 AJAX 调用?
  • 将其移至服务..?对不起,但你能说得更清楚些,因为我是新手。我还没有开始实现 AJAX。一个例子会很有帮助。谢谢

标签: c# asp.net multithreading performance


【解决方案1】:

如果您有一个在 ASP.NET 的单独线程中运行的函数,您可能需要考虑将其移至服务中。这有很多原因

请参阅this 答案(SO 上的众多答案之一)了解为什么在 ASP.NET 中运行长时间运行的任务并不总是一个好主意。

该服务的一个选项是使用 WCF。你可以开始here。你的服务可以实现一个方法,比如GetEvents(),你可以用它来拉你的事件。这样,您就不会在等待此过程完成时占用您的页面(当然使用 AJAX)。此外,这允许您更改 GetEvents() 的实现,而无需在您的网站上修改您的代码。

【讨论】:

  • 但是调用服务方法需要相同的时间。
  • 我在页面加载事件中有 3 个函数,两个从数据库中获取值,另一个如上所示。这两个函数都应该是服务调用吗?我想要的是,页面应该快速加载,如果有一个功能需要很长时间,它应该在后台运行并在完成后显示。在这个过程中,如果用户想要导航到一个新页面,它应该杀死它并继续前进。
  • 您应该考虑将日志记录请求移至服务。您还可以考虑使用某种类型的分页或机制来检索较少量的条目。你真的需要同时查看它们吗?
  • 是的,它是仪表板页面,因此需要在事件日志中显示事件错误的数量以及数据库中的用户和机器数量。
  • @user175084:没关系。我的意思是,您可能只想加载某个页面大小并将其返回给用户。 Windows 事件日志的问题通常是访问速度很慢。它更像是一种事后分析工具,而不是由您的应用程序实时读取。您确定您使用的是适合这项工作的工具吗?您可能需要重新考虑您的架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2010-12-13
  • 2014-05-25
相关资源
最近更新 更多