Взаимодействие между потоками - C# (193565)
Формулировка задачи:
Мне надо чтоб 1 поток перебирал числа из файла и , которые кратны 17, передавать второму потоку, который просто накапливает эти числа и выводит их на экран. Я вот написал, объясните, там компилятор говорит что я null передаю, что я не так делаю?
Я понимаю, что через одно место делаю это, но не приходит ничего в голову, как создать 2 процесс, который будет спать и только когда ему передают число, то он просыпается и прибавил число и снова спать. Если невозможно исправить мое "творение", то подскажите как это сделать разумно, желательно с примером. Заранее спасибо.
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(); } } }
Решение задачи: «Взаимодействие между потоками»
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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д