2010-03-24 5 views
2

Je reçois une erreur de délai d'attente lors du démarrage de mon service Windows. Je suis impatient de télécharger un fichier XML à partir d'un système distant qui provoque un timeout lors du service OnStart.Timeout HttpWebRequest dans le service Windows

C'est la méthode que je fais appel à partir OnStart:

public static StreamReader GetResponseStream() 
{ 
    try 
    { 
     EventLog.WriteEntry("Epo-Service_Retriver", "Trying ...", 
      EventLogEntryType.Information); 

     CookieContainer CC = new CookieContainer(); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
      Utils.GetWeeklyPublishedURL()); 
     request.Proxy = null; 
     request.UseDefaultCredentials = true; 
     request.KeepAlive = true; //THIS DOES THE TRICK 
     request.ProtocolVersion = HttpVersion.Version10; // THIS DOES THE TRICK 
     request.CookieContainer = CC; 

     WebResponse response = request.GetResponse(); 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 

     EventLog.WriteEntry("Epo-Service_Retriver", "Connected to Internet...", 
      EventLogEntryType.SuccessAudit); 
     return reader; 
    } 
} 

Est-il possible d'éviter ce délai d'attente?

Répondre

2

Vous devrez démarrer un thread pour faire ce travail.

Voici comment je me souviens de l'avoir fait en 1.1 (c'est un peu plus qu'un pseudo code), quelque chose comme ça;

protected override void OnStart(string[] args) 
{ 
    Foo f = new Foo(args); 
    f.MethodThatNeverExits(); 
} 

private void MethodThatNeverExits() 
{ 
    LongRunningInitialization(); 
    while (true) 
    { 
     Thread.Sleep(pollingInterval); 
     DoSomeWork(); 
    } 
}

Deviendrait;

private AutoResetEvent shutDownEvent; 
private Thread thread; 

protected override void OnStart(string[] args) 
{ 
    shutDownEvent = new AutoResetEvent(false); 

    Foo f = new Foo(args); 
    thread = new Thread(new ThreadStart(f.MethodThatNeverExits())); 
    thread.Start();   
} 

private void MethodThatNeverExits() 
{ 
    LongRunningInitialization(); 
    while (!shutDownEvent.WaitOne(pollingInterval, false)) 
    { 
     DoSomeWork(); 
    } 
} 

protected override void OnStop() 
{ 
    shutDownEvent.Set(); 
    thread.Join(timeToWait); 
} 
Questions connexes