首页 > 其他分享 >Wpf BackgroundWorker WorkerSupportsCancellation CancellationPending

Wpf BackgroundWorker WorkerSupportsCancellation CancellationPending

时间:2024-04-06 22:11:39浏览次数:20  
标签:CancellationPending Windows WorkerSupportsCancellation bgWorker System int Text 

//xaml
<Window x:Class="WpfApp37.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp37" WindowState="Maximized"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid TextBlock.FontSize="16">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="6">
            <TextBlock Text="From:"/>
            <TextBox Margin="10,2,2,2" Width="120" MaxLength="10" x:Name="_from"/>
            <TextBlock Text="To:" Margin="20,0,0,0"/>
            <TextBox Margin="10,2,2,2" Width="120" MaxLength="10" x:Name="_to"/>
        </StackPanel>
        <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="6">
            <Button Content="Calculate" x:Name="_calcBtn" Padding="4" Click="calc_Click" />
            <Button Content="Cancel" x:Name="_cancelBtn" Padding="4" Click="_cancelBtn_Click"/>
        </StackPanel>
        <TextBlock Grid.Row="3" x:Name="_result" FontSize="20" Margin="6" HorizontalAlignment="Center"/>
         
    </Grid>
</Window>


//cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
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;

namespace WpfApp37
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    { 
        BackgroundWorker _bgWorker;
        public MainWindow()
        {
            InitializeComponent();
        }
         
        private void calc_Click(object sender, RoutedEventArgs e)
        {
            _bgWorker = new BackgroundWorker();
            _bgWorker.WorkerSupportsCancellation = true;
            _bgWorker.DoWork += _bgWorker_DoWork;
            _bgWorker.RunWorkerCompleted += _bgWorker_RunWorkerCompleted;
            _calcBtn.IsEnabled = false;
            _cancelBtn.IsEnabled = true;
            _result.Text = "Calculating...";
            var data = new PrimeInputData()
            {
                First = int.Parse(_from.Text),
                Last = int.Parse(_to.Text)
            };
            _bgWorker.RunWorkerAsync(data);  
        }

        private void _bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if(_bgWorker.CancellationPending)
            {
                _result.Text = $"Cancelled Primes:{e.Result}";
            }
            _result.Text = $"Total Primes:{e.Result}";
            _calcBtn.IsEnabled = true;
        }

        private void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var data = e.Argument as PrimeInputData;
            if (data != null)
            {
                int count = 0;
                for (int i = data.First; i <= data.Last; i++)
                {
                    if(_bgWorker.CancellationPending)
                    {
                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            _result.Text = $"Cancelled Primes:{count}";
                        }));  
                        return; 
                    }
                    int limit = (int)Math.Sqrt(i);
                    bool isPrime = true;
                    for (int j = 2; j <= limit; j++)
                    {
                        if (i % j == 0)
                        {
                            isPrime = false;
                            break;
                        }
                    }
                    if (isPrime)
                    {
                        count++;
                    }
                }
                e.Result = count;
            }
        }

        private void _cancelBtn_Click(object sender, RoutedEventArgs e)
        {
            _bgWorker.CancelAsync();
            _calcBtn.IsEnabled = true;
            _cancelBtn.IsEnabled = false; 
        }
    }

    class PrimeInputData
    {
        public int First { get; set; }
        public int Last { get; set; }
    }
}

 

 

 

 

 

标签:CancellationPending,Windows,WorkerSupportsCancellation,bgWorker,System,int,Text,
From: https://www.cnblogs.com/Fred1987/p/18118008

相关文章

  • Wpf BackgroundWorker DoWork RunWorkerCompleted
    //xaml<Windowx:Class="WpfApp37.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • WPF登录界面样例
    XAML文件内容如下1<Windowx:Class="ERP.Views.Login"2xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4xmlns:d="......
  • 在RichTextBox mvvm中使用wpf工具包在插入符号处插入文本
    ,可以通过以下步骤实现:首先,确保你已经在项目中引用了WPF工具包。可以通过在VisualStudio中的项目引用中添加对WPF工具包的引用来完成。在你的MVVM模式中,创建一个名为"InsertTextCommand"的命令类,用于处理插入文本的逻辑。这个命令类应该实现ICommand接口,并且包含一个Execute方......
  • 强制设置和恢复依赖属性值(类似WPF内置的Style.Trigger和Template.Trigger)
    WPF元素的依赖属性的值由众多规则决定,最高优先级的规则决定依赖属性的最终当前值。如本地值>继承值>默认值。可以临时忽略一切规则,强制为依赖属性指定一个值,相当于强行插入一个最高优先级规则,后续可以删除此强制值(最高优先级规则),将依赖属性的值恢复成原来的计算规则。这个......
  • WPF实现树形下拉列表框(TreeComboBox)
    前言树形下拉菜单是许多WPF应用程序中常见的用户界面元素,它能够以分层的方式展示数据,提供更好的用户体验。本文将深入探讨如何基于WPF创建一个可定制的树形下拉菜单控件,涵盖从原理到实际实现的关键步骤。一、需求分析    树形下拉菜单控件的核心是将ComboBox与TreeVi......
  • WPF中Ribbon控件的使用
    WPF中Ribbon控件的使用这篇博客将分享如何在WPF程序中使用Ribbon控件。Ribbon可以很大的提高软件的便捷性。上面截图使Outlook2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可以找到想要的Menu。在Outlook2003时代,将Home下面的Menu都垂直的排列下来,操作的便捷程......
  • 【WPF应用34】WPF基本控件-Menu的详解与示例
    WPF(WindowsPresentationFoundation)是.NET框架的一个部分,用于构建桌面应用程序的用户界面。在WPF中,菜单(Menu)是一种常用的控件,用于提供一组选项或命令,使用户可以根据自己的需要执行特定的操作。本文将详细介绍WPF中的Menu控件,包括其基本用法、属性和事件。同时,我们将通过一......
  • 【WPF应用35】深度解析WPF中的TreeView控件:功能、用法、特性与最佳实践
    WPF(WindowsPresentationFoundation)是微软推出的一个用于构建桌面应用程序的图形子系统。在WPF中,TreeView是一种常用的树形控件,用于显示层次结构的数据显示。本文将详细介绍WPF中的TreeView控件,并提供一个简单的示例。一、TreeView控件的基本概念TreeView控件用于显示一......
  • WPF FlowDocument结构详解
    FlowDocument一、介绍FlowDocument是WPF中的流文档,用来承载大段文章。可以用来显示文章。或者在RichTextBox中编辑文章。FlowDocument没有多少方法,但有大量的属性,用来设置文章的字体,字体大小,前景色,背景色之类的。但这些都没什么特别的,最重要的,是FlowDocument的结构。二、FlowDocum......
  • 可能是迄今为止最好用的WPF加载动画功能(没有之一)
    可能是迄今为止最好用的WPF加载动画功能(没有之一) 前言当我们在开发应用程序时,用户体验往往是至关重要的一环。在应用程序加载大量数据或执行复杂操作时,为用户提供一个良好的加载体验变得至关重要。加载动画是其中一个有效的方式,它不仅能够告知用户应用程序正在进行工......