.NET 4.x Синхронизация потоков - C# (209439)
Формулировка задачи:
Не так давно начал заниматься c#.. возникла следующее недопонимание потоков. Программа ищет в цикле случайное число от 0 до 10, цикл повторяется 10 раз. Если случайное значение < 5, то в основном потоке выводится сообщение в richTextBox: "Главный поток, цикл № ", иначе запускается второстепенный поток и выводится сообщение в richTextBox: "Второстепенный поток, цикл № ".
Проблема в том, что сообщения выводятся в разнобой, не по порядку и могут повторяться, почему так происходит и как с этим бороться?
Код:
public partial class Form1 : Form { private delegate void RichTextBoxDelegate(string message); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int rand; Random r = new Random(); string mes; for (int i=0; i<10; i++) { rand=r.Next(0, 10); if (rand < 5) { mes = "Главный поток; "+"Цикл №: "+i; msgOut(mes); } else { mes = "Второстепенный поток; " + "Цикл №: " + i; new Thread(delegate() {msgOut(mes);}).Start(); } } } private void msgOut(string text) { if (richTextBox1.InvokeRequired) { RichTextBoxDelegate richtb = new RichTextBoxDelegate(msgOut); this.Invoke(richtb, new object[] { text }); } else richTextBox1.AppendText(text+"\n"); } };
Решение задачи: «.NET 4.x Синхронизация потоков»
textual
Листинг программы
private void button1_Click_1(object sender, EventArgs e) { int rand; Random r = new Random(); string mes; for (int i = 0; i < 10; i++) { rand = r.Next(0, 10); if (rand < 5) { mes = "Главный поток; " + "Цикл №: " + i; msgOut(mes); } else { mes = "Второстепенный поток; " + "Цикл №: " + i; new Thread(BackgroundThread).Start(mes); } } } private void BackgroundThread(object mes) { msgOut((string)mes); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д