2016-03-28 11 views
0

Мне нужно написать файл, который находится в удаленном каталоге. Мне нужно создать приложение журнала: каждый раз, когда возникает ошибка, я хочу получить доступ к этому удаленному файлу и написать строку. Но если удаленный каталог недоступен, мне все равно. Я просто хочу, чтобы основное приложение продолжало работать.C# Блокировать доступ к файлу после таймера

Обычно доступ к этому удаленному каталогу занимает 1 секунду. Если метод WriteLine занимает более 1 секунды, я хочу его заблокировать.

Я попытался с попыткой поймать, но тогда все приложение заблокировано в течение длительного времени. Мне нужно прервать эту попытку написать раньше.

Это основной код, используемый для записи на текстовый файл:

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/) или [Кварц] (http://www.quartz-scheduler.net/), поэтому, если файл используется другим процессом, вы можете перепланировать задание. – SarangK

+0

Но вероятность того, что другой процесс использует файл, очень низок. Вот почему мне все равно, если удаленный каталог недоступен, если один раз я не сохраняю LOG, это не большая проблема. Я просто не хочу, чтобы основное приложение было уложено по этой причине .. – Emanuele

ответ

0

1) не бросайте внутрь блока поймать

2) использовать управляемые потоки для ускорения процесса и повысить производительность

Если вы используете .NET 4.5 и выше блока я написал ниже, помогут , Просто добавьте это в свою программу

using 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 
      } 

     });