Je souhaite effectuer une requête HTTP lorsqu'un objet est collecté par le récupérateur de place. Je mets un simple appel dans le finailzer de la classe, qui fonctionne bien tant que l'application ne s'arrête pas.Demande HttpClient dans le finaliseur dans .NET
Lorsque le programme est terminé et que mon application veut s'arrêter, le CPG appelle le finaliseur comme auparavant, mais cette fois la requête est bloquée ou quitte simplement sans exception. Au moins le Studio ne montre pas d'exception, le programme se termine juste quand l'appel est envoyé.
Malheureusement, je dois utiliser le finaliseur pour envoyer cette requête, donc ne suggère pas d'utiliser Dispose à la place du finaliseur. Trouvons juste un moyen de le faire à partir de là si possible. :)
Voici la partie importante de mon code:
class MyExample
{
private readonly HttpClient myClient;
public MyExample()
{
var handler = new HttpClientHandler();
handler.UseProxy = false;
handler.ServerCertificateCustomValidationCallback = (a, b, c, d) => true;
this.myClient = new HttpClient(handler);
this.myClient.BaseAddress = new Uri("https://wonderfulServerHere");
}
public async void SendImportantData() => await this.myClient.SendAsync(new HttpRequestMessage(HttpMethod.Get, "ImportantData"));
~MyExample()
{
this.SendImportantData();
}
}
class Program
{
static void Main(string[] args)
{
MyExample ex = new MyExample();
/* ... */
ex = new MyExample();
/* ... */
GC.Collect();
GC.WaitForPendingFinalizers(); // Works fine here
/* ... */
} // Doesn't work here
}
Comment savez-vous que cela ne fonctionne pas? Le code sortant sans exception n'est pas la preuve qu'il ne fonctionne pas. Voulez-vous faire un POST et inclure des données plutôt qu'un GET?Est-il possible que le finaliseur ne soit pas appelé pour l'objet? – Luke
Bonne question. La demande ne s'affiche tout simplement pas de l'autre côté. Et le vrai code utilise POST, ce qui ne fait aucune différence avec cet exemple avec GET. –
Vous ne pouvez pas faire cela lorsque l'exécution est terminée. Mais je suis curieux de savoir quelle situation pourrait conduire à une exigence de faire une demande web dans le finaliseur? – Evk