Как заставить блокировку ждать, пока она не освободится? - PullRequest
0 голосов
/ 26 сентября 2018

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

lock(queueLock){ 
    while(queue.Count > 0){
        doSomething(queue.Dequeue());
    }
}

И еще один поток, который будет выполнять следующий код в зависимости от ввода-вывода (не определяется временным интервалом):

lock(queueLock){
   queue.Enqueue(input);       
}

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

Я не использую .net Я программирую на Unity, но в этом случае я не использую ничего конкретного Unity, кроме функции обновления.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

В конце концов, проблема была не с блокировкой, а с простой строкой кода перед блокировкой для enqueue. Я приводил e из json в другой класс и в итоге выдал исключение, которое не показывало единство.я, но так как я никогда не работал с многопоточностью в C #, прежде чем я стал искать в неправильном месте.

0 голосов
/ 26 сентября 2018

Попробуйте использовать потокобезопасный ConcurrentQueue без блокировок.

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