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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.364 из 5
Похожие ответы