[C#] Lock in Event

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sharper, 20 Mar 2011.

  1. Sharper

    Sharper New Member

    Joined:
    10 Mar 2010
    Messages:
    30
    Likes Received:
    1
    Reputations:
    0
    Стоит такая задача:

    Нужно использовать lock в event.

    PHP:
    private void label1_MouseUp(object senderMouseEventArgs e)
            {
                
    lock(lock_)
                {
                      
    очень долгое выполнение кода.
                }
            }
    При таком коде программа зависает. Я знаю что lock надо использовать в другом потоке. Что вы можете посоветовать ?
     
  2. PaCo

    PaCo Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    Смотря что подразумевается под "зависает" - если то что виснет 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 только для того что бы писать/читать из общих объектов не создавая очередей там где в них нет необходимости.
     
    #2 PaCo, 20 Mar 2011
    Last edited: 22 Mar 2011
  3. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    А зачем создавать объект?
    Во-первых есть же
    Во-вторых можно передать null

    lock можно использовать в любом потоке. дело вообще не в нем.
    у тебя скорее всего зависает ГУИ и тут правильно сказал Paco такое "долгое выполнение" нужно выносить из потока WinForms
     
    #3 GhostOnline, 21 Mar 2011
    Last edited: 21 Mar 2011
    2 people like this.
  4. Sharper

    Sharper New Member

    Joined:
    10 Mar 2010
    Messages:
    30
    Likes Received:
    1
    Reputations:
    0
    PHP:
    private void label_MouseUp(object senderMouseEventArgs e)
            {
                 new 
    Thread 
                

                    
    delegate() 
                    {
                        
    lock (lock_)
                        {
                            
    Thread.Sleep(10000);
                            
    count++;
                            
    this.label1.Invoke((MethodInvoker)delegate(){ this.label1.Text count.ToString();});
                        }
                    } 
                 ).
    Start(); 
            }
    сделал так .
     
  5. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    поробуй lock(this)