Domyślny limit czasu dla IIS to 20 minut. Oznacza to, że jeśli aplikacja ASP.NET nie otrzyma żadnych nowych żądań przez 20 minut, zamknie proces roboczy. To może zająć dużo czasu, aby ogrzać się proces z niczego - Loading zespoły do pamięci, prekompilacji itd
(Edit: I ułożyła prosty klasy pomocnika, który rozwiązuje problem standardowego limitu czasu - w zasadzie aplikacja internetowa "wyłapuje" się tak często, aby utrzymać proces przy życiu Idealne podejście polega na zmianie ustawień w IIS, ale w przypadku serwerów, gdzie nie jest to możliwe, moja klasa działa całkiem dobrze - Kod u dołu)
Podczas procesu roboczego wciąż żyje, nie powinien być depriorytized. Z pewnością nie tak szybko, jak opisujesz. Możliwe jest, że możesz polegać na przedmiotach, które są buforowane przez bardzo krótki okres czasu i wypadają, gdy nie są żądane przez więcej niż kilka sekund. Nie wiedząc więcej o szczegółach aplikacji, nie można tego powiedzieć.
Profilowanie aplikacji jest jak zwykle jedynym sposobem na uzyskanie konkretnych informacji. Używanie produktu takiego jak ANTS pomoże ci określić, gdzie w kodzie aplikacja spędza najwięcej czasu, abyś mógł zlokalizować miejsce "zawieszenia".
public class KeepAlive
{
private static KeepAlive instance;
private static object sync = new object();
private string _applicationUrl;
private string _cacheKey;
private KeepAlive(string applicationUrl)
{
_applicationUrl = applicationUrl;
_cacheKey = Guid.NewGuid().ToString();
instance = this;
}
public static bool IsKeepingAlive
{
get
{
lock (sync)
{
return instance != null;
}
}
}
public static void Start(string applicationUrl)
{
if(IsKeepingAlive)
{
return;
}
lock (sync)
{
instance = new KeepAlive(applicationUrl);
instance.Insert();
}
}
public static void Stop()
{
lock (sync)
{
HttpRuntime.Cache.Remove(instance._cacheKey);
instance = null;
}
}
private void Callback(string key, object value, CacheItemRemovedReason reason)
{
if (reason == CacheItemRemovedReason.Expired)
{
FetchApplicationUr();
Insert();
}
}
private void Insert()
{
HttpRuntime.Cache.Add(_cacheKey,
this,
null,
Cache.NoAbsoluteExpiration,
new TimeSpan(0, 10, 0),
CacheItemPriority.Normal,
this.Callback);
}
private void FetchApplicationUrl()
{
try
{
HttpWebRequest request = HttpWebRequest.Create(this._applicationUrl) as HttpWebRequest;
using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
HttpStatusCode status = response.StatusCode;
//log status
}
}
catch (Exception ex)
{
//log exception
}
}
}
Usage (być może w App_Start):
KeepAlive.Start("http://www.yoursite.com/");
+1, ale należy do serverfault. –
Czy kompilujesz swoją stronę? Jeśli nie, tracisz bardzo duże ulepszenia wydajności. – codethrift
@theminesgreg: strony są kompilowane, debugowanie nie jest ustawione, optymalizacje są włączone dla (dowolnych) bibliotek dll. @John: Nie jestem pewien, czy to należy do serverfault, ponieważ to naprawdę sprawia mi kłopot jako programisty, ale popraw mnie, jeśli się mylę. – Abel