Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

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

Ответ
 
Опции темы
Старый 30.08.2013, 16:14   #1
Dr_Net
Новичок
 
Аватар для Dr_Net
 
Регистрация: 30.08.2013
Адрес: Германия
Сообщений: 1
Репутация: 10
По умолчанию 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


08:09.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru