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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2012, 22:59   #1
D][mon
Форумчанин
 
Регистрация: 05.01.2010
Сообщений: 150
По умолчанию BackgroundWorker (C#,WPF)

Доброго времени суток.
проблема в следующем:
если вызывать ReportProgress()
на время выполнения фонового потока, основной поток блокируется.
прога вычисляет интеграл левым прямоугольником
Код:
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows;

namespace Lab6._1
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private static BackgroundWorker backgroundWorker;

        public MainWindow()
        {
            InitializeComponent();

            backgroundWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
            backgroundWorker.ProgressChanged += BackgroundWorkerOnProgressChanged;
            backgroundWorker.RunWorkerCompleted += BackgroundWorkerOnRunWorkerCompleted;
            backgroundWorker.DoWork += BackgroundWorkerOnDoWork;
        }
        class IntegralParams
        {
            public IntegralParams(double a, double b, double h)
            {
                A = a;
                B = b;
                H = h;
            }
            public double A { get; set; }
            public double B { get; set; }
            public double H { get; set; }
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            progressBar.Value = 0;

            backgroundWorker.RunWorkerAsync(new IntegralParams(Convert.ToDouble(ta.Text), Convert.ToDouble(tb.Text), Convert.ToDouble(th.Text)));
        }

        private void BackgroundWorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
        {
            tres.Items.Add(runWorkerCompletedEventArgs.Result);
            progressBar.Value = 0;
        }

        private void BackgroundWorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
        {
            progressBar.Value = progressChangedEventArgs.ProgressPercentage;
            opSpeed.Content = progressChangedEventArgs.UserState;
        }

        private void BackgroundWorkerOnDoWork(object sender, DoWorkEventArgs args)
        {
            var worker = ((BackgroundWorker)sender);
            var sw = new Stopwatch();
            sw.Start();
            var area = 0.0;
            var a = ((IntegralParams)args.Argument).A;
            var fleft = f(a);
            var b = ((IntegralParams)args.Argument).B;
            var h = ((IntegralParams)args.Argument).H;
            var width = h;
            for (var x = a + width; x <= b; x += width)
            {
                if (worker.CancellationPending) return;
                var fright = f(x);
                area = area + (fleft + fright) * width / 2;
                fleft = fright;
                var perc = x * 100 / b;
                //worker.ReportProgress((int)perc);
            }

            worker.ReportProgress(100);
            sw.Stop();
            args.Result = area.ToString() + " " + sw.Elapsed.ToString();
        }

        private double f(double a)
        {
            return Math.Sin(a);
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            backgroundWorker.CancelAsync();
        }
    }
}

Последний раз редактировалось D][mon; 13.12.2012 в 23:01.
D][mon вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 15:00
BackgroundWorker не понятное поведение coNsept C# (си шарп) 0 08.10.2012 04:06
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10
Многопоточность - класс BackgroundWorker SerzhVl Общие вопросы .NET 5 25.06.2010 19:34
backgroundworker Neymexa Общие вопросы .NET 3 06.05.2009 17:13