Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2013, 16:14   #1
Dr_Net
Новичок
Джуниор
 
Аватар для Dr_Net
 
Регистрация: 30.08.2013
Сообщений: 1
По умолчанию WPF - Как правильно использовать Task, Timer и BackgroundWorker совместно ?

Привет всем. Совсем недавно начал изучать работу с потоками в WPF и возникли немного вопросов, на которые, надеюсь, смогу ответить с вашей помощью. Задача программы выполнить определенную работу каждые 10 секунд. Разбить эту работу на несколько частей используя потоки (Task) и при этом использовать BackgroundWorker чтобы пользовательский интерфейс не зависал во время выполнения работ. В интернете нашел много пример работы с тасками, но не смог найти несложные примеры, которые бы обьяснили как таски правильно использовать с таймером, BackgroundWorker и локами конечно. Для ясности привожу пример, которую написал, чтобы вы могли посмотреть и посоветовать правильно ли написан код. Благодаря вашим советам я смогу лучше понять как работает многопоточность в WPF. Жду с нетерпением ваших сообщением. Спасибо.


Код:
namespace timer_and_thread
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            DispatcherTimer TimerObject;
            Task[] tasks;
            readonly object _countLock = new object();
            int[] Summ = new int[10];
            int Index = 0;
 
            public MainWindow()
            {
                InitializeComponent();
                TimerObject = new DispatcherTimer();
                TimerObject.Tick += new EventHandler(timer_Elapsed);
                TimerObject.Interval = new TimeSpan(0, 0, 10);
            }
 
            // вызвать метод каждые 10 секунд
            private void timer_Elapsed(object sender, EventArgs e)
            {
                TimerObject.Stop();
 
                BackgroundWorker backgroundWorkerObject = new BackgroundWorker();
                backgroundWorkerObject.DoWork += new DoWorkEventHandler(StartThreads);
                backgroundWorkerObject.RunWorkerAsync();
 
                TimerObject.Start();
            }
 
 
            private void StartThreads(object sender, DoWorkEventArgs e)
            {
                tasks = new Task[4];
                tasks[0] = Task.Factory.StartNew(() => DoSomeLongWork());
                tasks[1] = Task.Factory.StartNew(() => DoSomeLongWork());
                tasks[2] = Task.Factory.StartNew(() => DoSomeLongWork());
                tasks[3] = Task.Factory.StartNew(() => DoSomeLongWork());
 
                // Даем задачам 1 секунду для их запуска 
                Thread.Sleep(1000);
            }
 
            private void DoSomeLongWork()
            {
                while (Index < Summ.Length)
                {
                    int localIndex = 0;
 
                    // блокируем глобальную переменную Index 
                    lock (_countLock)
                    {
                        localIndex = Index;
                        Index++;
                    }
 
                    // Я написал простой пример работы. Тут может быть большая вычислительная работа.
                    Random rnd = new Random();
                    int someResult = rnd.Next(1, 100000);
 
                    //  блокируем глобальную переменную Summ для записи в нее вычисленного результата
                    lock (_countLock)
                    {
                        Summ[localIndex] = someResult;
                    }      
                }
            }
 
            // Кнопка, с помощью которой запускаю таймер и начинается работа приложения
            private void Start_Button_Click_1(object sender, RoutedEventArgs e)
            {
                TimerObject.Start();
            }
 
        }
    }
Dr_Net вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BackgroundWorker (C#,WPF) D][mon Помощь студентам 0 13.12.2012 22:59
Как правильно использовать MySQL EndoCrinolog PHP 6 24.08.2012 21:08
как создать и использовать Timer с FTP мимо Работа с сетью в Delphi 1 13.02.2011 23:43
Как правильно использовать MonthCalendar Shanuzina Компоненты Delphi 1 04.03.2010 11:58
как правильно использовать OR AND mpdasa Общие вопросы Delphi 2 19.01.2010 17:30