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;
}
}
}
Вы выполняете код 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;
}
}
Продвижение своими сайтами как стратегия роста и независимости