Wątki - Jak sprawdzić zakończenie wątków w klasie MAIN?

0

Kod wygląda następująco:

    class Program
    {
        private static int sumap = 0;
        private static int suman = 0;
 
        private static int sumapin = 0;

        static Thread t1 = new Thread (Suma);
        static Thread t2 = new Thread (Suma1);

        static private int p = 0, n = 0;

        static void Main(string[] args)
        {
               t2.Start();
               t1.Start();
        }

             static public void Suma() 
             {
                 for (var i = 1; i <= 100000007; i++)
                 {
                     if (i % 2 == 0)
                         sumap += i;
                 }
                 p++;
                 if (n == 1 && p == 1)
                 {
                     Console.WriteLine(sumap + " " + suman + " p");
                     Console.WriteLine(sumapin = suman + sumap);
                 }
             }

             static public void Suma1()
             {
                 for (var i = 1; i <= 100000007; i++)
                 {
                     if (i % 2 != 0)
                         suman += i;
                 }
                 n++;
               
```csharp
  if (n == 1 && p == 1)
{
                 
                     Console.WriteLine(sumap + " " + suman + " n");
                     Console.WriteLine(sumapin = suman + sumap);
                 }
         }   
}

Jeden wątek zlicza sumę liczb parzystych, a drugi w tym samym czasie nieparzystych.

1. Dlaczego SumaLiczbParzystych i SumaLiczbNieparzystych są ujemne? :O.
2. Czy jest jakaś możliwość, aby sprawdzić czy Thread został zakończony? Chodzi mi oto, aby wywalić:

     
```csharp
  if (n == 1 && p == 1)
{
                 
                     Console.WriteLine(sumap + " " + suman + " n");
                     Console.WriteLine(sumapin = suman + sumap);
                 }

do Main'a żeby nie powielać tego warunku w metodach ;/.

0
  1. Pewnie wykraczasz poza zakres int'a, stąd pojawiają się błędne wyniki. Zmień typ np. na long.
  2. Można to zrobić na przykład tak:
class Program
{
        private delegate void Delegate();

	static void Main(string[] args)
	{
		Delegate del = new Delegate(Method);

		del.BeginInvoke(Callback, null);

		Console.Read();
	}

	static void Method()
	{
		Console.WriteLine("Method() ...");
		Thread.Sleep(5000);
	}

	static void Callback(IAsyncResult ar)
	{
		Console.WriteLine("Done");
	}
}
 

Ogólnie poczytaj sobie o delegatach i BeginInvoke/EndInvoke. Pozwalają też między innymi na zwracanie wartości z wątków, co być może w twoim przypadku byłoby lepsze ;)

0

http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx

odpowiedź na pytanie z tematu:
t1.Join();
t2.Join();

1 użytkowników online, w tym zalogowanych: 0, gości: 1