Форма блокируется потоком

95
20 ноября 2020, 18:40

C# WinForm. Thread запускается и работает, но блокирует все элементы формы. Что я делаю не так? Если есть необходимость, могу показать код, он короткий.

        namespace InvokeTest
{
  public partial class MyForm:Form
  {
    public delegate void AddListItem();
    public AddListItem myDelegate;
    private Thread myThread;
    int count;
    public bool bStop;
       public MyForm()
       {
            InitializeComponent();
            myDelegate += new AddListItem(AddListItemMethod);
            count = 0;
            bStop = true;
        }      
          public void AddListItemMethod()
          {
              String myItem;
              while(!bStop)
             {
                ++count;
                myItem = "MyListItem" + count.ToString();
                myListBox.Items.Add(myItem);
                myListBox.Update();
                Thread.Sleep(1000);
              }
            myThread.Abort();
         }
         private void button1_Click(object sender, EventArgs e)
         {
           myThread = new Thread(new ThreadStart(ThreadFunction));
           bStop = false;
           myThread.Start();
         }
         private void ThreadFunction()
         {
            myListBox.Invoke(myDelegate);//моя вставка 
         }
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Stop";
            bStop = true;
        }
    }
}
Answer 1

Вы выполняете код AddListItemMethod в UI-потоке (понятно, раз вы там обращаетесь к UI-элементам!), а в нём нельзя использовать Sleep для задержки.

Код, создающий новый поток, и затем из нового потока запускающий AddListItemMethod через Invoke — это сложный метод запустить код синхронно.

(Ну и вы пользуетесь Thread.Abort, так делать вообще нельзя.)

Правильно делать так, как описано в этом ответе.

public partial class MyForm : Form
{
    int count = 0;
    bool bStop = true;
    public MyForm()
    {
        InitializeComponent();
    }      
    async Task AddListItemMethod()
    {
        String myItem;
        while (!bStop)
        {
            ++count;
            var myItem = "MyListItem" + count.ToString();
            myListBox.Items.Add(myItem);
            myListBox.Update(); // это всё ещё нужно?
            await Task.Delay(1000);
        }
    }
    async void button1_Click(object sender, EventArgs e)
    {
        bStop = false;
        await AddListItemMethod();
    }
    void button2_Click(object sender, EventArgs e)
    {
        textBox1.Text = "Stop";
        bStop = true;
    }
}
READ ALSO
имя не существует в контексте

имя не существует в контексте

Использую selenium с c#Необходимо сделать ожидание

96
Ошибка преобразования HSV в RGB и наоборот

Ошибка преобразования HSV в RGB и наоборот

Народ у меня есть slider в проекте который двигает другого но вроде не должен

118
Ограничить вводимые данные. SQL

Ограничить вводимые данные. SQL

Пытался уже решить этот вопрос, но никак не получаеться решить проблему

117
Yii 2 проверка на авторизированного пользователя его id

Yii 2 проверка на авторизированного пользователя его id

Нужен совет правильно я сделал проверку в layoutsphp

119