как не блокировать цикл в форме окна - PullRequest
0 голосов
/ 21 марта 2012

Я довольно новичок в программировании .net, и я хотел бы получить некоторые предложения. Я пытаюсь создать простое клиентское приложение с графическим интерфейсом VS2010 Designer для создания единой формы, в которой у меня есть: 1 comboBox, (содержащий список возможных команд) 1 кнопка (используется для выполнения команды, выбранной в выпадающем списке) 1 изображение (в котором я отображаю изображения, полученные из моего серверного приложения) Мне удалось создать свое клиентское приложение и отображать другое изображение в окне для картинок, полученном с сервера, каждый раз, когда я нажимаю кнопку.

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

Я не уверен, как это сделать, потому что, если я попытаюсь зациклить нажатие кнопки события, графический интерфейс перестанет отвечать на запросы, и у меня не будет возможности изменить команду в выпадающем списке.

Любая помощь будет высоко ценится. Спасибо.

1 Ответ

1 голос
/ 21 марта 2012

Вот «дешевый» способ обновления графического интерфейса с помощью функции ReportProgress класса BackgroundWorker.Сначала поместите объект BackgroundWorker в форму.Тогда ...

private void Form1_Load(object sender, EventArgs e)
{
    backgroundWorker1.DoWork += DoWork;          
    backgroundWorker1.ProgressChanged += UpdateGui;
    backgroundWorker1.WorkerReportsProgress = true;
    backgroundWorker1.RunWorkerAsync();
}

private void DoWork(object sender, DoWorkEventArgs e)
{
    while (true)
    {
        System.Threading.Thread.Sleep(1000);
        backgroundWorker1.ReportProgress(0);
    }          
}
void UpdateGui(object sender, ProgressChangedEventArgs e)
{
    textBox1.Text = DateTime.Now.ToLongTimeString();
}
...