Кто заблокировал мои вещи, используя ключевое слово lock в c # - PullRequest
0 голосов
/ 08 июля 2011

У меня есть ключевое слово lock в моем коде. Он зависает, потому что что-то еще заблокировано. Есть ли какая-нибудь команда или утилита, которую я могу использовать, чтобы узнать, кто или что?

Ответы [ 4 ]

2 голосов
/ 08 июля 2011

Вы можете присоединиться к процессу с помощью windbg и использовать sosex.dll, чтобы увидеть, какие потоки заблокированы командой dlk.

http://www.stevestechspot.com/SOSEXV40NowAvailable.aspx

2 голосов
/ 08 июля 2011

Если вы используете блокировку, то вы должны использовать ее на объекте, которым вы управляете. Обычно это фиктивный объект, используемый только для ваших замков, т.е.

Object lockObj = new Object();
//some code
void MyCoolFunc()
{
    lock(lockObj)
    {
        //do some not threadsafe stuff
    }
}
0 голосов
/ 08 июля 2011

Я думаю, что вы можете использовать VS.NET, чтобы присоединиться к зависшему процессу и нажать на паузу.Затем откройте окно Threads (Debug -> Windows -> Threads) и проверьте, какие потоки заблокированы и почему.Это выглядит как самое простое решение.

0 голосов
/ 08 июля 2011

К сожалению, нет простого ответа ... но вы можете использовать такие инструменты, как CHESS , чтобы помочь вам в этом. В конечном итоге вам, вероятно, придется проверить свой код на наличие условий гонки, которые могут привести к взаимоблокировкам. В любом месте, где вы видите оператор блокировки или другой объект синхронизации потоков (например, Monitors, Mutex и т. Д.), Вы захотите проверить, на что они блокируются, и найти другие фрагменты кода, которые блокируют одно и то же

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...