.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);
}