2016-03-28 32 views
0

我需要編寫位於遠程目錄中的文件。我需要創建一個日誌應用程序:每次發生錯誤時,我想訪問這個遠程文件並寫一行。但是如果遠程目錄不可用,我不在乎。我只是想讓主應用程序繼續運行。c#在定時器後阻止對文件的訪問

通常訪問這個遠程目錄需要1秒。如果WriteLine方法需要超過1秒鐘,我想阻止它。

我嘗試了一個try catch,但隨後整個應用程序被阻塞了很長時間。我需要儘快打斷這種嘗試。

這是用於對txt文件寫入主代碼:

try 
{   
    string TargetFile = "F:\\file.txt"; 
    using (StreamWriter sw = File.AppendText(TargetFile)) 
    { 
     sw.WriteLine("LOG: an error occured\n"); 
     sw.Close(); 
    } 
} 
catch (Exception) 
{ 

    throw; 
} 

我無法弄清楚如何來解決這個問題。也許通過在單獨的線程內運行寫操作?謝謝你的幫助!

+0

您是否嘗試過使用異步方法?我聽說它對這種IO操作非常有用。請參考:https://msdn.microsoft.com/en-us/library/hh137902(v=vs.110).aspx – Hendry

+0

我建議你應該使用像[Hangfire]這樣的後臺工作(http://hangfire.io/ )或[Quartz](http://www.quartz-scheduler.net/),因此如果該文件正在被另一個進程使用,您可以重新計劃作業。 – SarangK

+0

但是另一個進程使用該文件的概率非常低..這就是爲什麼我不在乎遠程目錄是否無法訪問,如果有一次我不保存LOG不是一個大問題。我只是不希望主應用程序因此被堆疊。 – Emanuele

回答

0

1)不要扔catch塊

2)使用管理線程來加快進程並提高性能

如果您使用的是.NET 4.5,我已經寫在下面將幫助塊以上。只需在程序中添加此項

使用System.Threading.Tasks;

var errorWriter = Task.Run(() => 

     { 
      try 
      { 
       string TargetFile = "F:\\file.txt"; 
       using (StreamWriter sw = File.AppendText(TargetFile)) 
       { 
        sw.WriteLine("LOG: an error occured\n"); 
        sw.Close(); 
        return "success"; 
       } 
      } 
      catch (Exception ex) 
      { 
       return ex.Message; 

       // throw; _________________ don't throw here 
      } 

     });