Ответы пользователя по тегу Многопоточность
  • Как организовать постоянное обновление DataGrid в отдельном потоке?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Как организовать постоянное обновление DataGrid в отдельном потоке, чтобы при этом DataGrid был доступен, т.к. планируется добавить возможность выбирать строку из DataGrid и смотреть подробную информацию.

    Нельзя обновлять элементы UI из не UI потока. Можно получать данные в другом потоке, но обновлять UI нужно из UI потока. Я бы просто пробегал по ObservableCollection<{T}>, где T это класс, реализующий интерфейс INotifyPropertyChanged и обновлял нужные объекты уже в UI потоке. Судя по всему, проект не придерживается паттерна MVVM, а лучше бы придерживался.

    Список процессов нужно получать как раз в Task.Run(...), а вот вызывать обновление процессов в UI через Dispatcher или SynchronizationContext.

    Посмотри мои ответы здесь:
    Как осуществить ввод и вывод данных WPF?
    Здесь про Task.Delay и вообще цикл в Task.Run Как сделать цикл на основе ответа на Web запрос в C#?
    Здесь как перенаправлять выполнение через SynchronizationContext в UI поток С# Taks и Invoke почему то блокируется форма?

    Ещё, ожидание в методах, которые запускаются тасками нужно делать через вызов await Task.Delay(...), но точно не через Thread.Sleep(...):
    using System;
    using System.Threading.Tasks;
    
    namespace Tasks
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                // Так
                await Task.Run(async () =>
                {
                    while (true)
                    {
                        await Task.Delay(1000);
                        Console.Write("=");
                    }
                });
    
                // Или так (обрати внимание на Unwrap()) 
                await Task.Factory.StartNew(async () =>
                {
                    while (true)
                    {
                        await Task.Delay(1000);
                        Console.Write("=");
                    }
                }).Unwrap();
            }
        }
    }
    Ответ написан
    1 комментарий