Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499

Выполнение фоновых операций без зависания формы

21.01.2015, 14:01. Показов 3686. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не думал, что такой вопрос возникнет, ибо думал, что знал путь решения, однако...
Есть метод, допустим, такой:
C#
1
2
3
4
5
6
7
8
9
10
public void Running()
{
      Int32 i=0;
     while(true)
     {
          Thread.Sleep(100);
          i++;
          listbox1.Items.Add(i.ToString());
      }
}
Нужно чтобы он записывал данные в listbox1 без подвисания основного UI. Вопрос так то заурядный, однако конструкции ниже не помогают, UI висит:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
            Task run = null;
            Task.Factory.StartNew(
                () =>
                {
                    run.Start(scheduler);
                });
 
            run = new Task(
                () =>
                {
                    Running();
                });
C#
1
2
3
4
5
6
7
 ThreadPool.QueueUserWorkItem((a) => 
                {
               this.BeginInvoke(new Action(() =>
                   {
                       Running();
                   }));   
                });
Помогите кто чем может. Чуть не забыл: приложение WinForms
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2015, 14:01
Ответы с готовыми решениями:

Выполнение фоновых операций без зависания формы
Здраствуйте, к примеру есть какойто метод, который, например, что то делает на протяжении 3 секунд, все это время форма будет в режиме...

Зависание формы при потере фокуса при выполнении в ней фоновых операций
Здравствуйте, коллеги. Возник следующий вопрос, который не получается решить самостоятельно. Информации по нему найти не удалось,...

Ждать завершения потока (без зависания формы)
Здравствуйте товарищи! Столкнулся с такой вот проблемой. Пишу программу, которая запускает через cmd.exe некие команды. Форма...

6
21 / 21 / 12
Регистрация: 08.01.2015
Сообщений: 66
21.01.2015, 14:13
Примерно так -

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace lbox
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        System.Threading.SynchronizationContext sc;
        public MainForm()
        {
            InitializeComponent();
            sc = System.Threading.SynchronizationContext.Current;
            ((AsyncCallback) delegate
             {
                while (true)
                {
                    System.Threading.Thread.Sleep(3000);
                    sc.Post( delegate { listBox1.Items.Add("added line"); }, null);
                }
             }).BeginInvoke(null, null, null);
        }
    }
}
Добавлено через 3 минуты
Да, еще не забываем делать invalidate() на форме, иначе результатов можно и не увидеть.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
21.01.2015, 14:30  [ТС]
Хм, спасибо за ответ, но, к сожалению, UI точно так же продолжает висеть если в делегат засунуть Running()
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2015, 14:45
Лучший ответ Сообщение было отмечено tapochka как решение

Решение

tapochka, форма, кнопка, листбокс.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += button1_Click;
        }
 
        void button1_Click(object sender, EventArgs e) {
            Task.Factory.StartNew(() => {
                Running();
            });
        }
        void Running() {
            int i = 0;
            while (true) {
                listBox1.Invoke((Action)(() => { listBox1.Items.Add(i.ToString()); }));
                Thread.Sleep(500);
                i++;
            }
        }
    }
}
0
21 / 21 / 12
Регистрация: 08.01.2015
Сообщений: 66
21.01.2015, 14:50
Ваш Running() неправильный. Нельзя из одного потока лезть в другой напрямую со всякими listbox1.Items.Add(i.ToString()); Точнее можно было на ранних версиях дотнета, где еще можно было отключить CheckForIllegalCrossThreadCalls(или как-то так). Но это злое зло. Возможно это и есть причина зависания - хотя должен ругаться. Либо у вас вообще не получается создать дополнительный поток.

Приведенный мной код абсолютно рабочий. Все что вам надо - подогнать его под свои нужды.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
21.01.2015, 15:01  [ТС]
insite2012, спасибо, вот теперь точно заработало

всем спасибо за ответы...
и если кому не сложно, то мог бы кто-нибудь помочь сделать это еще через SynchronizationContext, ибо информации о нем мало, только вот более-менее адекватное нашел:
http://www.codeproject.com/Art... ext-Part-I
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2015, 15:04
Цитата Сообщение от tapochka Посмотреть сообщение
мог бы кто-нибудь помочь сделать это еще через SynchronizationContext
По заявкам пользователей)))
Самый простой вариант)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += button1_Click;
        }
 
        void button1_Click(object sender, EventArgs e) {
            int i = 0;
            TaskScheduler ts = TaskScheduler.FromCurrentSynchronizationContext();
            Task.Factory.StartNew(() => {
                while (true) {
                    Task<int>.Factory.StartNew(() => i++)
                        .ContinueWith(task => listBox1.Items.Add(task.Result), ts);
                    Thread.Sleep(500);
                }
            });
        }       
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2015, 15:04
Помогаю со студенческими работами здесь

Выполнение операций сразу после появления формы
Доброго времени суток Такая вот проблема возникла. Имеется форма 1 в которую вводится фамилия (Прикладываю скрин). Фамилия...

Как сделать задержку в программе без зависания формы
Доброго времени суток :) Никак не получается решить одну задачу. Допустим, есть форма с одной кнопкой. Нужно, чтобы через 3 секунды...

Как остановить цикл в потоке без зависания формы
Здравствуйте Есть цикл, в цикле при определенных условиях начинается скачка файла, скачка начинается в отдельном потоке, поэтому чтобы...

Выполнение фоновых задач по таймеру
Добрый день, курил мануалы как можно реализовать фоновые задачи отсюда metanit UWP но мне нужно их реализовать через таймер, например...

Сделать форму доступной во время выполнения фоновых операций
Как создать потоки,а то у меня пока действие не выполнится до конца,нельзя нажать кнопки на форме,так же на ворме присутствуют счетчики 2,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru