处理功能需要花费大量时间线程

时间:2012-03-28 20:33:56

标签: c# asp.net multithreading performance

我有一个在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");
        }
    }

我在pageload事件中有3个函数,两个用于从DB获取值,另一个用于上面显示。

这两个功能都应该是服务电话吗?

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

1 个答案:

答案 0 :(得分:2)

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

请参阅this回答(很多关于SO的问题之一),了解为什么在ASP.NET中运行长时间运行的任务并不总是一个好主意。

该服务的一个选项是使用WCF。您可以开始使用here。您的服务可以实现一种方法,比如GetEvents(),您可以使用该方法来提取您的活动。这样你就不会占用你的页面等待这个过程完成(当然使用AJAX)。此外,这使您可以更改GetEvents()的实施,而无需触及您网站上的代码。