using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; namespace TimerAndWorker { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private readonly int RECURSIVE_COUNT = 10000; private DispatcherTimer _timer; public MainWindow() { InitializeComponent(); InitInstance(); } private void InitInstance() { _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromMilliseconds(1); _timer.Tick += _timer_Tick; _timer.Start(); } private void _timer_Tick(object? sender, EventArgs e) { lblTime.Content = DateTime.Now.ToString("HH:mm:ss.fff"); } private void btnSyncCalc_Click(object sender, RoutedEventArgs e) { pbCalcProcess.Value = 0; lbResult.Items.Clear(); int result = 0; for (int i = 0; i < RECURSIVE_COUNT; i++) { if (i % 7 == 0) { lbResult.Items.Add(i); lbResult.SelectedIndex = lbResult.Items.Count - 1; lbResult.ScrollIntoView(lbResult.SelectedItem); result++; } Thread.Sleep(1); pbCalcProcess.Value = Convert.ToInt32((double)i / RECURSIVE_COUNT * 100); } MessageBox.Show($"Numbers between 0 and {RECURSIVE_COUNT} divisable by 7: {result}"); } private void btnAsyncCalc_Click(object sender, RoutedEventArgs e) { pbCalcProcess.Value = 0; lbResult.Items.Clear(); BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += Worker_DoWork; worker.ProgressChanged += Worker_ProgressChanged; worker.RunWorkerCompleted += Worker_RunWorkerCompleted; worker.RunWorkerAsync(RECURSIVE_COUNT); } private void Worker_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e) { MessageBox.Show($"Numbers between 0 and {RECURSIVE_COUNT} divisable by 7: {e.Result}"); } private void Worker_ProgressChanged(object? sender, ProgressChangedEventArgs e) { pbCalcProcess.Value = e.ProgressPercentage; if (e.UserState != null) { lbResult.Items.Add(e.UserState); lbResult.SelectedIndex = lbResult.Items.Count - 1; lbResult.ScrollIntoView(lbResult.SelectedItem); } } private void Worker_DoWork(object? sender, DoWorkEventArgs e) { int max = (int)e.Argument; int result = 0; for (int i = 0; i < max; i++) { int progressPercentage = Convert.ToInt32((double)i / RECURSIVE_COUNT * 100); if (i % 7 == 0) { result++; (sender as BackgroundWorker)?.ReportProgress(progressPercentage, i); } else (sender as BackgroundWorker)?.ReportProgress(progressPercentage); Thread.Sleep(1); } e.Result = result; } } }