Взаимодействие между потоками - C# (193565)

Узнай цену своей работы

Формулировка задачи:

Мне надо чтоб 1 поток перебирал числа из файла и , которые кратны 17, передавать второму потоку, который просто накапливает эти числа и выводит их на экран. Я вот написал, объясните, там компилятор говорит что я null передаю, что я не так делаю?
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        private double suma = 0;
        private double zn = 0;
        private ThreadStart myThreadDelegate;
        private Thread thr;
        private Thread thr1;//можно ли так разбить потоки и будет ли это тогда многопоточность
        public void first()
        {
            Console.WriteLine("Поток 2 запущен");
        }
        public void Thread()
        {
            int i = 0;
            string[] readText = File.ReadAllLines(@"D:\test.txt");
            foreach (string s in readText)
            {
                zn = Convert.ToDouble(s);
                if (zn % 17 == 0)
                {
                     Resume();
                    Thread2(zn);
                    zn = 0;
                }
                i++;
                Console.Clear();
                Console.WriteLine("Обработано {0}/1000000000", i);
            }
        }
        public void Thread2(double chys)
        {
            suma += chys;
            Console.Clear();
            Console.WriteLine("Сума чисел кратных 17 ={0}", suma);
            Suspend();
        }
        public void Resume()
        {
            thr1.Resume();
        }
        public void Suspend()
        {
            thr1.Suspend();// Необработанное исключение типа "System.NullReferenceException" в ConsoleApplication1.exe
 
        }
        public void go()
        {
            ThreadStart myThreadDelegate = new ThreadStart(Thread);
            Thread thr = new Thread(myThreadDelegate);
            thr.Start();
        }
        public void go1()
        {
            ThreadStart myThreadDelegate = new ThreadStart(first);
            Thread thr1 = new Thread(myThreadDelegate);
            thr1.Start();
            Suspend();
            //thr1.Suspend();
        }
        [STAThread]
        static void Main(string[] args)
        {
            //double zn = 0;
            Program sw = new Program();
            sw.go();
            sw.go1();
            Console.ReadLine();
        }
    }
}
Я понимаю, что через одно место делаю это, но не приходит ничего в голову, как создать 2 процесс, который будет спать и только когда ему передают число, то он просыпается и прибавил число и снова спать. Если невозможно исправить мое "творение", то подскажите как это сделать разумно, желательно с примером. Заранее спасибо.

Решение задачи: «Взаимодействие между потоками»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
 
namespace ConsoleApplication5
{
    class Program
    {
 
 
      
        static void Main(string[] args)
        {
            const string fname = "numbers.txt";
            var watch = new Stopwatch();
            var random = new Random();
            using (var writer = new BinaryWriter(File.Create(fname)))
            {   
            Console.WriteLine("Пишем числа в файл:{0}",fname);
            watch.Start();
            Enumerable.Range(0,10240).Select(i=>random.Next(10,120)).ToList().ForEach(writer.Write);
            watch.Stop();
          
            Console.WriteLine("Заняло времени:{0}",watch.Elapsed);
                Console.WriteLine("Any key...");
                Console.ReadKey();
            }
            var st=new Stack<int>();
            var readerThread = new Thread(() =>
            {
                using (var reader = new BinaryReader(File.Open(fname, FileMode.Open)))
                {
                  
                    while (reader.PeekChar() != -1)
                    {
                       var number= reader.ReadInt32();
                        if (number%17 == 0)
                        {
                           st.Push(number);
                            
                        }
                       
                    }
                   
                }
            });
 
            var worker = new Thread(() =>
            {
                while (true)
                {
                    if(st.Count>0)
                    Console.Write("{0,3}\t",st.Pop());
                }
                
                
 
            }){IsBackground = true};
            readerThread.Start();
            worker.Start();
            Console.ReadKey();
 
           
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы