none
Passaggio di reference di code a 2 thread RRS feed

  • Domanda

  • Ciao,

    sto facendo i primi passi con C# e ho creato un Main con 2 thread che scrivono sullo stdio, nessun problema. Ora vorrei aggiungerci una coda, in pratica un thread scrive sulla coda q1 e l'altro scoda dalla medesima.Ho un errore di compilazione perché la reference della coda non e' vista dai thread :

    public class myExample
    {
        static void Main(string[] args)
            {

                 Queue Q1 = new Queue();
                 Thread ThWork1 = new Thread(Work1);
                 Thread ThWork2 = new Thread(Work2);
                 ThWork1.Start();
                 Console.WriteLine("----------------");
                 ThWork2.Start();

            } // end main

        static void Work1()
        {
            for (int i = 1; i <= 10; i++)
            {
                Console.WriteLine("Work 1 is called " + i.ToString()); //keep alive del th1

                Q1.Enqueue("Prova"); // ERRORE : Error 1 The name 'Q1' does not exist in the current 

                Thread.Sleep(4000); //Sleep for 4 seconds
            }
        }

        static void Work2()
        {
            for (int i = 1; i <= 10; i++)
            {
                Console.WriteLine("Work 2 is called " + i.ToString()); 
    //keep alive del th1
            }
        }
     }

    Quindi sebbene le code siano dichiarate e allocate nel main i thread non sembrano vederle, c'e' un modo di passarle ai thread come reference?

    Grazie

    mercoledì 15 luglio 2020 14:11

Risposte

  • Se sostituisci le chiamate a Work1 e Work2 rispettivamente con due espressioni lambda, risolvi, perchè tutte le variabili che utilizzi nel thread principale vengono viste anche dai due thread secondari:

    class Program
        {
            static void Main(string[] args)
            {
    
                Queue Q1 = new Queue();
                Thread ThWork1 = new Thread(() => {
    
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("Work 1 is called " + i.ToString()); //keep alive del th1
    
                        Q1.Enqueue("Prova");
                        
                        Thread.Sleep(4000); //Sleep for 4 seconds
                    }
                    
    
                });
    
                Thread ThWork2 = new Thread(() => {
    
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("Work 2 is called " + i.ToString()); //keep alive del th1
                    }
    
                });
    
                ThWork1.Start();
                Console.WriteLine("----------------");
                ThWork2.Start();
    
            } // end main 
            
        }

    mercoledì 15 luglio 2020 19:50

Tutte le risposte

  • Se sostituisci le chiamate a Work1 e Work2 rispettivamente con due espressioni lambda, risolvi, perchè tutte le variabili che utilizzi nel thread principale vengono viste anche dai due thread secondari:

    class Program
        {
            static void Main(string[] args)
            {
    
                Queue Q1 = new Queue();
                Thread ThWork1 = new Thread(() => {
    
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("Work 1 is called " + i.ToString()); //keep alive del th1
    
                        Q1.Enqueue("Prova");
                        
                        Thread.Sleep(4000); //Sleep for 4 seconds
                    }
                    
    
                });
    
                Thread ThWork2 = new Thread(() => {
    
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("Work 2 is called " + i.ToString()); //keep alive del th1
                    }
    
                });
    
                ThWork1.Start();
                Console.WriteLine("----------------");
                ThWork2.Start();
    
            } // end main 
            
        }

    mercoledì 15 luglio 2020 19:50
  • Se sostituisci le chiamate a Work1 e Work2 rispettivamente con due espressioni lambda, risolvi, perchè tutte le variabili che utilizzi nel thread principale vengono viste anche dai due thread secondari:

    class Program
        {
            static void Main(string[] args)
            {
    
                Queue Q1 = new Queue();
                Thread ThWork1 = new Thread(() => {
    
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("Work 1 is called " + i.ToString()); //keep alive del th1
    
                        Q1.Enqueue("Prova");
                        
                        Thread.Sleep(4000); //Sleep for 4 seconds
                    }
                    
    
                });
    
                Thread ThWork2 = new Thread(() => {
    
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("Work 2 is called " + i.ToString()); //keep alive del th1
                    }
    
                });
    
                ThWork1.Start();
                Console.WriteLine("----------------");
                ThWork2.Start();
    
            } // end main 
            
        }

     Grazie mille !!!!
    giovedì 16 luglio 2020 06:33