Стоит такая задача: Нужно использовать lock в event. PHP: private void label1_MouseUp(object sender, MouseEventArgs e) { lock(lock_) { очень долгое выполнение кода. } } При таком коде программа зависает. Я знаю что lock надо использовать в другом потоке. Что вы можете посоветовать ?
Смотря что подразумевается под "зависает" - если то что виснет UI - то вынести долгое выполнение кода из потока с формой, e.g.: PHP: ThreadPool.QueueUserWorkItem( (O_o) => { lock(lock_) { очень долгое выполнение кода. } }); .................................................................. new Thread ( delegate() { lock(lock_) { очень долгое выполнение кода. } } ).Start(); или сделать асинхронную версия event-a(AsyncOperation, AsyncOperationInvoker,PostOperationCompleted и etc.) и возможно еще и label1.Enable=false. А если под "зависает" подразумевается что все потоки становятся у турникета и дружно ждут выхода первого потока из критической секции - то тут использования lock только для того что бы писать/читать из общих объектов не создавая очередей там где в них нет необходимости.
А зачем создавать объект? Во-первых есть же Во-вторых можно передать null lock можно использовать в любом потоке. дело вообще не в нем. у тебя скорее всего зависает ГУИ и тут правильно сказал Paco такое "долгое выполнение" нужно выносить из потока WinForms
PHP: private void label_MouseUp(object sender, MouseEventArgs e) { new Thread ( delegate() { lock (lock_) { Thread.Sleep(10000); count++; this.label1.Invoke((MethodInvoker)delegate(){ this.label1.Text = count.ToString();}); } } ).Start(); } сделал так .