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;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Народ у меня есть slider в проекте который двигает другого но вроде не должен
Пытался уже решить этот вопрос, но никак не получаеться решить проблему
Нужен совет правильно я сделал проверку в layoutsphp