2016-04-07 9 views
0

私はショッピング用のWindowsストアアプリを持っています。エラーを管理するLogfileを作成しました。しかし、ファイルにデータを追加するときにエラーが発生することがあります。Windowsストアアプリで文字列をファイルに追加するにはどうすればよいですか?

 public static async void logError(string pagename, string functionname, string errordescription) 
     { 
      try 
      { 
       var folder = ApplicationData.Current.LocalFolder; 
       var file = await folder.CreateFileAsync("errorLog.txt", CreationCollisionOption.OpenIfExists); 
       await FileIO.AppendTextAsync(file, string.Format("{0}Date: {1} \t PageName: {2} \t FunctionName: {3} \t ErrorDescription: {4}", Environment.NewLine, DateTime.Now, pagename, functionname, errordescription)); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     } 

それは数行を書きますが、いくつかの時間の後に、それは次のエラーをスロー: アクセスが拒否されました

は、ここに私のコードです。 (HRESULTからの例外:0x80070005(E_ACCESSDENIED))

このエラーが発生する理由はありません。誰でも私にこれを解決する方法を提案できますか?

+0

'async void'は、イベントハンドラまたは同様の関数にのみ使用する必要があります。そうしないと、メソッドが終了したことを検出できません。以前の呼び出しが実行されている間にファイルに書き込もうとした可能性があります。署名を 'async Task'に変更し、' await LogError ... 'のようなログメソッドを待ちます。いずれにせよ、コールスタックを含む完全な例外を投稿してください。 'Exception.ToString()'を呼び出すことでこれを得ることができます。 –

+0

@PanagiotisKanavosはい、ときどき最後の呼び出しが実行されていても書き込みを呼び出すことがあります。どうすれば "非同期タスク"を扱うかについてのリンクやアイディアを教えてください。 – Nikki

+0

@PanagiotisKanavos呼び出し中にLogErrorを "待つ"場合、この呼び出しを含むすべてのメソッドのシグネチャに "async"を追加する必要があります。 LogErrorの呼び出しは、ほとんどのメソッドのtry-catchにあります。すべてのメソッドに "async"を追加するのは良いですか? –

答えて

0

このエラーの理由は、各LogError呼び出しでファイルを開いたり作成したりするためです。これらの呼び出しは非同期で並行して発生する可能性があるため、ログファイルを開く際に競合が発生します。ファイルが最初の呼び出しですでに開いている場合、2回目の呼び出しはアクセス拒否エラーで失敗します。

「同期」の使用についてのコメントに記載されている問題を修正しても、この問題の解決には役立ちません。 )ロックをオブジェクトまたはミューテックスを使用する -

1)一度だけファイルを開くLoggerクラスを作成し、それはのlogErrorが同様のlogErrorの(心の同時コールを呼び出す機能:

は、いくつかの可能な解決策がありませ。

2)LogErrorをオブジェクト全体にロックするか、Mutexを使用します。したがって、LogErrorへの呼び出しはすべて順番に行われ、ログファイルにアクセスする際の競合条件はありません。

3)各LogError呼び出しで一意のファイル名を使用します(名前に新しいGUIDを追加するなど)。

関連する問題