Взаимодействие между потоками - 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();
}
}
}