私のプログラムが終了したら、いくつかの例外データ(存在する場合)をサーバに投稿したいと思います。デストラクタでHttpClientを使用する
私は、メインウィンドウのビューモデルのデストラクタでトリガされるデストラクタ..
を持って、私はこれを実行します。
~ProgramWizardViewModel()
{
if ((Program.Errors.Count > 0)
&& (WizardData?.User != null))
{
string errorsText = string.Format(string.Join("\n", Program.Errors));
WizardData.client.UploadExceptionReport(errorsText);
}
}
WizardData.clientは、メソッドUploadExceptionReportを持っているが(私はSOからコピーされていること)
public void UploadExceptionReport(String s)
{
using (var client = new HttpClient())
{
var uri = new Uri(Program.ServerUri + "api/exception_report");
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("exception_string", s)
});
var result = client.PostAsync(uri, content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(resultContent);
}
}
しかしclient.PostAsyncで、デバッグは例外なく、完全に停止し、リターン:
プログラム '[3364] Program.vshost.exe'がコード0(0x0)で終了しました。
私はこれが非同期のためにあると推測しています。 POSTは要求を送信するスレッドを作成しますが、デストラクタは終了し、オブジェクトは実行前に失われます。
So:プログラム終了時にこのデータをPOSTするにはどうすればよいでしょうか? このコードが失敗する理由は何ですか?
多分それは 'AppDomain.UnhandledException'を使用することをお勧めしますか?または、フォーム終了時の他のイベント。 – abatishchev
非同期送信を取り出し、ブロッキング送信を使用してください。非同期では、呼び出し元のスレッドが処理してメインアプリを閉じることができます。 –