ガベージコレクタによってオブジェクトが収集されているときにHTTPリクエストを行いたいと思います。クラスのfinailzerに簡単な呼び出しを行います。これは、アプリケーションがシャットダウンしていない限り正常に動作します。.NETのファイナライザでのHttpClientリクエスト
プログラムが終了し、アプリケーションがシャットダウンしたいとき、GCは前と同じようにファイナライザを呼び出しますが、今回は要求がスタックしたり、例外なく終了します。少なくともスタジオは例外を表示しません。コールが送信されると、プログラムは終了します。
残念ながら、このリクエストを送信するにはファイナライザを使用する必要があります。ファイナライザの代わりにDisposeを使用することはお勧めしません。可能であれば、そこからそれを行う方法を見つけましょう。 :)ここで
は、私のコードの重要な部分である:HTTPリクエストを配置し、一般的には非自明な何かをやって
GC.Collect();
前
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
}
どのように機能していないのですか?例外なしで終了するコードは、機能していないという証拠ではありません。あなたはPOSTを行い、GETではなくいくつかのデータを含めることを意味していますか?ファイナライザがオブジェクトに対して呼び出されていない可能性はありますか? – Luke
良い質問です。リクエストは相手側に表示されません。実際のコードではPOSTを使用していますが、この例ではGETで違いはありません。 –
これは、実行時の終了時には実行できません。しかし、どのような状況でファイナライザでWebリクエストを行う必要があるのか不思議です。 – Evk