2016-01-06 3 views
1

Я пытаюсь создать консольное приложение, которое создаст четыре потока для четырех функций, а затем получит то, что возвратит функции. Thread 1 должен рассчитать сумму массива, заполненного случайными числами, и вернуть его, поток 2 вычисляет произведение одного и того же массива и возвращает его, поток 3 создает и возвращает случайное целое число от -1000 до 1000, а четвертое - сумму, произведение и x (случайное число), сравнивает их и показывает, кто больше, чем кто.C#: настройка потоков и получение функций возвращаемое значение

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading; 

    namespace threadsproject 
    { 
     class Program 
     { 
      public int thread1(int [] a, int n) 
      { 
       int i = n; 
       int sum = 0; 
      for (int j = 0; j < i; j++) 
      { 
       sum = a[j] + sum; 
      } 
      Console.WriteLine("\nThe sum is: "); 
      return sum; 
     } 
      public int thread2(int[] a, int n) 
      { 
     int prod = 1; 
     for (int j = 0; j < n; j++) 
     { 
      prod = a[j] * prod; 
     } 
     Console.WriteLine("\nThe product is: "); 
     return prod; 
    } 
    public int thread3() 
    { 
     Random rnd = new Random(); 
     int x; 
     x = rnd.Next(-1000, 1000); 
     Console.WriteLine("\nYour random number is: {0}", x); 
     return x; 
    } 
    public void thread4(int sum, int prod, int x) 
    { 
     Console.WriteLine("\n"); 
     if (sum < prod && prod < x) 
     { 
      Console.WriteLine("T1,T2,T3"); 
     } 
     else if (sum < x && x < prod) 
     { 
      Console.WriteLine("T1,T3,T2"); 
     } 
     else if (x < sum && sum < prod) 
     { 
      Console.WriteLine("T2,T1,T3"); 
     } 
     else if (x < prod && prod < sum) 
     { 
      Console.WriteLine("T2,T3,T1"); 
     } 
     else if (prod < sum && sum < x) 
     { 
      Console.WriteLine("T3,T1,T2"); 
     } 
     else if(prod < sum && sum == x) 
     { 
      Console.WriteLine("T3,T1=T2"); 
     } 
     if (sum < prod && prod == x) 
     { 
      Console.WriteLine("T1,T2==T3"); 
     } 
     else 
      Console.WriteLine("T3,T2,T1"); 
    } 

    static void Main(string[] args) 
    { 
     Random rnd = new Random(); 
     string s; 
     int n; 
     int [] numbers = null; 
     Console.WriteLine("Give the size of the array: "); 
     s = Console.ReadLine(); 
     n = int.Parse(s); 
     for(int i=0; i<n; i++) 
     { 
      numbers[i] = rnd.Next(-100, 100); 
     } 

     int sum, prod, x; 

     Thread mythread1 = new Thread(delegate() { thread1(numbers, n); }); 
     Thread mythread2 = new Thread(delegate() { thread2(numbers, n); }); 
     Thread mythread3 = new Thread(() => thread3()); 
     Thread mythread4 = new Thread(delegate() { thread4(sum, prod, x); }); 

     mythread1.Start(); 
     mythread2.Start(); 
     mythread3.Start(); 
     mythread4.Start(); 
    } 
} 

}

Так что, когда я создавать темы, я получаю ту же ошибку всем: Ссылка на объект требуется для нестатических полей, методы или свойств «threadsproject.Program.thread < 1,2,4> (int int int) '. Я работаю на visual studio 2013 .net 4.6. Не имея большого опыта программирования в потоках, я хотел бы помочь понять, что я делаю неправильно. Спасибо заранее всем!

+0

Всегда хорошая идея для google в сообщении об ошибке. –

ответ

0

Вы должны научиться C# задачи TPL.

using System; 
using System.Threading; 

namespace StackOverflowConsole 
{ 
    class Program 
    { 
    private static int SUM, PROD, x; 

    public static void thread1(int[] a, int n) 
    { 
     int i = n; 
     int sum = 0; 
     for (int j = 0; j < i; j++) 
     { 
      sum = a[ j ] + sum; 
     } 
     Console.WriteLine("\nThe sum is: " + sum); 
     SUM = sum; 
    } 
    public static void thread2(int[] a, int n) 
    { 
     int prod = 1; 
     for (int j = 0; j < n; j++) 
     { 
      prod = a[ j ] * prod; 
     } 
     Console.WriteLine("\nThe product is: " + prod); 
     PROD = prod; 
    } 
    public static void thread3() 
    { 
     Random rnd = new Random(); 
     int x; 
     x = rnd.Next(-1000, 1000); 
     Console.WriteLine("\nYour random number is: {0}", x); 
     Program.x = x; 
    } 
    public static void thread4(int sum, int prod, int x) 
    { 
     Console.WriteLine("\n"); 
     if (sum < prod && prod < x) 
     { 
      Console.WriteLine("T1,T2,T3"); 
     } 
     else if (sum < x && x < prod) 
     { 
      Console.WriteLine("T1,T3,T2"); 
     } 
     else if (x < sum && sum < prod) 
     { 
      Console.WriteLine("T2,T1,T3"); 
     } 
     else if (x < prod && prod < sum) 
     { 
      Console.WriteLine("T2,T3,T1"); 
     } 
     else if (prod < sum && sum < x) 
     { 
      Console.WriteLine("T3,T1,T2"); 
     } 
     else if (prod < sum && sum == x) 
     { 
      Console.WriteLine("T3,T1=T2"); 
     } 
     if (sum < prod && prod == x) 
     { 
      Console.WriteLine("T1,T2==T3"); 
     } 
     else 
      Console.WriteLine("T3,T2,T1"); 
    } 

    static void Main(string[] args) 
    { 
     Random rnd = new Random(); 
     string s; 
     int n; 

     Console.WriteLine("Give the size of the array: "); 
     s = Console.ReadLine(); 
     n = int.Parse(s); 

     int[] numbers = new int[ n ]; 

     for (int i = 0; i < n; i++) 
     { 
      numbers[ i ] = rnd.Next(-100, 100); 
     } 

     Thread mythread1 = new Thread(delegate() { thread1(numbers, n); }); 
     mythread1.Start(); 

     Thread mythread2 = new Thread(delegate() { thread2(numbers, n); }); 
     mythread2.Start(); 

     Thread mythread3 = new Thread(() => thread3()); 
     mythread3.Start(); 

     mythread1.Join(); 
     mythread2.Join(); 
     mythread3.Join(); 

     Thread mythread4 = new Thread(delegate() { thread4(SUM, PROD, x); }); 
     mythread4.Start(); 
     mythread4.Join(); 

     Console.ReadLine(); 
    } 
} 
} 
0

вы должны объявить свои функции в качестве статических потоков functions.your потоков вызова не являющиеся статических функций внутри статического основного метода

Смежные вопросы