Первый поток считывает данные из текстового файла. Если считается число, оно передается во 2-й поток, если слово – в 3-й. Второй поток находит максимум и минимум получаемых чисел и выводит эти данные на экран. Третий поток находит слово с максимальным количеством гласных букв и выводит его на экран.
chavarria, Под "потоком" имеется в виду thread или task? В какой момент времени потоки выводят инфу на экран - после обработки каждого нового значения или в конце после того как весь файл прочитан? есть код который ты набросал но в нем что-то не работает или ты хочешь чтобы тебе всё написали?
vtlstolyarov, я просто в кнопку его вставил using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using static System.Net.Mime.MediaTypeNames; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using System.Runtime.Remoting.Channels; using System.Threading; using System.Threading.Channels; namespace pzos_lab5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string filePath = "test.txt"; if (File.Exists(filePath)) { var channelOption = new UnboundedChannelOptions() { SingleReader = false, SingleWriter = true }; var numberChannel = Channel.CreateUnbounded<int>(channelOption); var wordChannel = Channel.CreateUnbounded<string>(channelOption); async Task ReadAndPublish() { string text = File.ReadAllText(filePath); foreach (var word in text.Split(' ')) { if (int.TryParse(word, out var number)) { await numberChannel.Writer.WriteAsync(number); } else { await wordChannel.Writer.WriteAsync(word); } } numberChannel.Writer.TryComplete(); wordChannel.Writer.TryComplete(); } async Task ConsumeNumbers() { int min = int.MaxValue; int max = int.MinValue; while (await numberChannel.Reader.WaitToReadAsync()) { while (numberChannel.Reader.TryRead(out var number)) { if (number < min) { min = number; textBox3.Text = Convert.ToString(min); } if (number > max) { max = number; textBox4.Text = Convert.ToString(max); } } } } async Task ConsumeWords() { while (await wordChannel.Reader.WaitToReadAsync()) { int maxLength = 0; while (wordChannel.Reader.TryRead(out var word)) { if (word.Length > maxLength) { maxLength = word.Length; textBox1.Text = word; } } } } var consumers = new[] { new Thread(ConsumeNumbers().Wait), new Thread(ConsumeWords().Wait), new Thread(ReadAndPublish().Wait), }; foreach (var consumer in consumers) { consumer.Start(); } foreach (var consumer in consumers) { consumer.Join(); } } else { textBox1.Text = "Файл не найден"; } } } } C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using static System.Net.Mime.MediaTypeNames; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using System.Runtime.Remoting.Channels; using System.Threading; using System.Threading.Channels; namespace pzos_lab5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string filePath = "test.txt"; if (File.Exists(filePath)) { var channelOption = new UnboundedChannelOptions() { SingleReader = false, SingleWriter = true }; var numberChannel = Channel.CreateUnbounded<int>(channelOption); var wordChannel = Channel.CreateUnbounded<string>(channelOption); async Task ReadAndPublish() { string text = File.ReadAllText(filePath); foreach (var word in text.Split(' ')) { if (int.TryParse(word, out var number)) { await numberChannel.Writer.WriteAsync(number); } else { await wordChannel.Writer.WriteAsync(word); } } numberChannel.Writer.TryComplete(); wordChannel.Writer.TryComplete(); } async Task ConsumeNumbers() { int min = int.MaxValue; int max = int.MinValue; while (await numberChannel.Reader.WaitToReadAsync()) { while (numberChannel.Reader.TryRead(out var number)) { if (number < min) { min = number; textBox3.Text = Convert.ToString(min); } if (number > max) { max = number; textBox4.Text = Convert.ToString(max); } } } } async Task ConsumeWords() { while (await wordChannel.Reader.WaitToReadAsync()) { int maxLength = 0; while (wordChannel.Reader.TryRead(out var word)) { if (word.Length > maxLength) { maxLength = word.Length; textBox1.Text = word; } } } } var consumers = new[] { new Thread(ConsumeNumbers().Wait), new Thread(ConsumeWords().Wait), new Thread(ReadAndPublish().Wait), }; foreach (var consumer in consumers) { consumer.Start(); } foreach (var consumer in consumers) { consumer.Join(); } } else { textBox1.Text = "Файл не найден"; } } } }
chavarria, нет, чел - ты не просто его в кнопку вставил, ты пытаешься обновить значения в элементах формы не из UI потока - это так просто не работает, надо обновлять через Invoke, как-то так textBox1.Invoke((MethodInvoker)delegate { textBox1.Text = word; }); ну и поля для min и max так же
vtlstolyarov, проблема не в этом, даже если я вообще вывод убираю, то программа так же намертво зависает при нажатии на кнопку