0

バックグラウンド ジョブとして Windows サービスを使用して、Facebook C#sdk を使用してユーザー プロファイルに写真をアップロードしています。そして、考えられるほぼすべての場所で例外をログに記録しており、ほとんどの場合、正常に機能しています。しかし、時折、非常に頻繁に、次の例外が発生します。これは、ハンドラーによってキャッチされず、Windows イベント ロガーによってログに記録され、サービスを終了します。

Application: PhotoService.exe    
Framework Version: v4.0.30319    
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Exception    
Stack:
at System.Net.Security._SslStream.WriteCallback(System.IAsyncResult)
at System.Net.LazyAsyncResult.Complete(IntPtr)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Net.ContextAwareResult.Complete(IntPtr)
at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

見た目から、これは FacebookClient.PostTaskAsync() メソッド呼び出しで発生していますが、限られたスタックトレース情報でトラブルシューティングする方法がわかりません。以下は私の写真投稿方法ブロックです:

public void PostPhotoToTimeline(string filename, byte[] photo, EventHandler<FacebookApiEventArgs> callbackCompleted)
{
    var _filename = filename;
    var mediaObject = new FacebookMediaObject
    {
        ContentType = "image/jpeg",
        FileName = _filename
    }.SetValue(photo);

    _fb.PostCompleted += callbackCompleted;
    var parameters = new Dictionary<string, object>();
    parameters["file"] = mediaObject;

    _fb.PostTaskAsync("/me/photos", parameters);
} 

現時点での私の最大の問題は、この例外が発生するとサービスが終了し、サービスの監視がまだ設定されていないため、サービスが停止したことを確認する方法がないことです。私が正しく理解している場合、この例外は別のスレッドで発生し、処理されないため、サービス全体がダウンします。これは正しいです?なぜこれがどこで起こっているのか、または以前にこの例外に直面した人はいますか? これらの予期しない例外をキャッチするために、「legacyUnhandledExceptionPolicy」について読みました。これにより、サービスが終了するのを防ぐことができますか? また、使用することをお勧めしますか? 一度に多くの質問をして申し訳ありませんが、これらはすべて関連しており、Google はこれまでのところ私の友人ではありません。ご協力いただきありがとうございます。

4

1 に答える 1