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

360
21 января 2017, 09:36

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
Поиск элемента в файле

Поиск элемента в файле

Есть txt - файл вида: [Володя_Синяк #1 Охранник 5 лет], в котором #1 это номер отделаЗадача заключается в том, чтобы при вводе нужного отдела сортировало...

290
Microsoft.ProjectOxford.Face

Microsoft.ProjectOxford.Face

Можно ли как-то получить рисунок по PersistedFacesID?

311
Профили ASP.NET

Профили ASP.NET

Для чего в ASPNET используются провайдеры профилей? Какую выгоду они имеют? И в чем различие между HttpContext

241