Как узнать, какой идентификатор процесса и идентификатор / имя потока имеет открытый файл - PullRequest
0 голосов
/ 21 апреля 2010

Я использую C # в приложении и у меня возникают проблемы с блокировкой файла.

Кусок кода делает это,

while (true)
{
   Read a packet from a socket (with data in it to add to the file)
   Open a file // one of these randomly throws an exception saying that the file is locked
   Writes data to it
   Close a file
} 

Но в процессе файл становитсязаперта.Я не совсем понимаю, как, мы определенно отлавливаем и сообщаем об исключениях, поэтому я не вижу, как файл не закрывается каждый раз.

Мое лучшее предположение, что что-то еще открывает файл,Это вряд ли будет другое приложение, но это может быть другая тема, но я просто хочу доказать это в любом случае.Может ли кто-нибудь предоставить кусок кода, чтобы проверить, открыт ли файл, и если да, сообщите, какой processId и threadId открыл файл.

Например, если у меня был этот код,

StreamWriter streamWriter1 = new StreamWriter(@"c:\logs\test.txt");
streamWriter1.WriteLine("Test");
// code to check for locks??
StreamWriter streamWriter2 = new StreamWriter(@"c:\logs\test.txt");
streamWriter1.Close();
streamWriter2.Close();

Это вызовет исключение, потому что файл блокируется, когда мы пытаемся открыть его во второй раз.Так где же комментарий, который я мог бы поместить туда, чтобы сообщить, что текущее приложение (идентификатор процесса) и текущий поток (идентификатор потока) заблокировали файл?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Это не дает прямого ответа на ваш вопрос, но бесплатные Sysinternals инструменты типа Process Explorer и Process Monitor действительно полезны для такого рода отладки.

1 голос
/ 21 апреля 2010

Вот некоторый псевдокод, который защитит ресурс между потоками:

while (true)
{
   Read a packet from a socket (with data in it to add to the file)
   lock (static locker object)
   {
       Open a file
       Writes data to it
       Close a file
    }
}

в мире C # объект статической блокировки обычно объявляется на уровне класса таким образом:

private static readonly object locker = new object();

Я бы также рекомендовал использовать ключевое слово using для защиты ресурса файла, если операторы между открытием и закрытием файла выдают исключение. Повторно сделанный псевдокод:

while (true)
{
   Read a packet from a socket (with data in it to add to the file)
   lock (static locker object)
   {
       using (Open a file)
       {
           Writes data to it
       } // leaving the using block will close the file
    }
}
...