处理一个占用大量时间的函数线程
本文关键字:时间 线程 函数 一个 处理 | 更新日期: 2023-09-27 18:29:23
我有一个函数,它在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中获取值,另一个如上图所示。
这两个功能都应该是服务调用吗?
我想要的是,页面应该快速加载,如果有一个函数需要很长时间,它应该在后台运行并在完成时显示。在这个过程中,如果用户想导航到一个新页面,它应该杀死它并继续前进。
如果您有一个函数在ASP.NET的单独线程中运行,您可能需要考虑将其移动到服务中。这种有很多原因
请参阅以下答案(SO上的众多答案之一),了解为什么在ASP.NET中运行长时间运行的任务并不总是一个好主意。
该服务的一个选项是使用WCF。你可以从这里开始。您的服务可以实现一个方法,比如GetEvents()
,您可以使用它来提取事件。这样,您就不会在等待这个过程完成时(当然使用AJAX)占用页面。此外,这允许您在不接触网站上的代码的情况下更改GetEvents()
的实现。