【WPF】异步任务更新UI、绑定命令、绑定字符串属性

【WPF】异步任务更新UI、绑定命令、绑定字符串属性_第1张图片

WPF异步任务

【WPF】异步任务更新UI、绑定命令、绑定字符串属性_第2张图片

主界面

属性改变触发UI更新:

        //打印的内容:文本框显示的内容
        public string PrintNumbers
        {
            get { return printNumbers; }
            set
            {
                printNumbers = value;
                RaisePropertyChanged();
            }
        }
        

命令绑定:

在视图模型中定义命令:

        //绑定的命令
        public ICommand StartButtonCommand { get; set; }
        public ICommand AddTaskCommand { get; set; }
        public ICommand ClearAllData { get; set; }

在主界面xaml中绑定命令:

        

 创建命令实例:

            StartButtonCommand = new DelegateCommand(TaskExecutionOrder);
            AddTaskCommand = new DelegateCommand(SelectedTaskExecution);
            ClearAllData = new DelegateCommand(ClearData);

绑定RadioButton属性:

        //radiobutton绑定的属性  
        public bool IsOddChecked //选择奇数属性
        {
            get { return isOddChecked; }
            set { SetProperty(ref isOddChecked, value); RaisePropertyChanged(); }
        }
        //radiobutton绑定的属性 
        public bool IsEvenChecked//选择偶数属性
        {
            get { return isEvenChecked; }
            set { SetProperty(ref isEvenChecked, value); RaisePropertyChanged(); }
        }
 

执行异步任务:

        private static Queue queue = new Queue();//操作队列
        private static readonly object queuelock = new object();//队列锁
Task.Run(() => ExecuteTasks());//执行异步任务,从队列中取出任务动作
  //开始按钮执行异步任务
        private async void ExecuteTasks()
        {
            
            while (true)
            {
                Action task = null;
                lock (queuelock)
                {
                    if (queue.Count > 0)
                    {
                        task = queue.Dequeue();//取出一个任务操作
                    }
                }
                if (task != null)
                {
                    await Task.Run(() =>
                    {
                        task.Invoke();
                        Thread.Sleep(100);
                    });
                }

            }
        }
        //开始按钮委托命令  :执行 奇数、偶数任务
        public void TaskExecutionOrder()
        {
            queue.Enqueue(OddNumbers);
            queue.Enqueue(EvenNumbers);
            taskCount = queue.Count;//任务数
        }
  //奇数任务操作
        private void OddNumbers()
        {
                Dispatcher.CurrentDispatcher.Invoke(() =>
               {
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += "OddNumbers between 1 to 100" + Environment.NewLine + "Task:" + " " + taskNumber.ToString();
                   this.PrintNumbers += Environment.NewLine;
                   this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Started" + "\n";

               });
                for (int i = 0; i <= 100; i++)
                {

                    Dispatcher.CurrentDispatcher.Invoke(() =>
                    {
                        if (i % 2 != 0)//奇数
                        {
                            this.PrintNumbers += i.ToString() + " "; //属性改变,触发UI更新

                            Thread.Sleep(10);
                        }

                    });

                }
                
                this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Stopped" + "\n";
                taskNumber++;//下一任务号
                Thread.Sleep(1000);
            
        }

完整代码:

XAML主界面:

    
        
            
            
        
        

        

主界面交互逻辑:

namespace MultiThreadingWPF
{
    using Prism.Commands;
    using Prism.Mvvm;
    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Input;
    using System.Windows.Threading;
    using MultiThreadingWPF.Model;

    public class MainWindowViewModel : BindableBase
    {

        private static Queue queue = new Queue();//操作队列
        private static readonly object queuelock = new object();//队列锁

        private string printNumbers;//打印的数字
        private string taskName;//任务名
        private static int taskNumber = 1;//任务号

        private TaskModel __taskModel;//任务模型  未使用

        private string executionOrder;//             执行订单

        private bool isOddChecked;//奇数选择字段
        private bool isEvenChecked;//偶数选择字段
        //绑定的命令
        public ICommand StartButtonCommand { get; set; }
        public ICommand AddTaskCommand { get; set; }
        public ICommand ClearAllData { get; set; }
        //任务数
        private int taskCount;
        //未使用TaskModel 
        public TaskModel TasksModel
        {
            get { return __taskModel; }
            set { SetProperty(ref __taskModel, value); RaisePropertyChanged(); }
        }
        
        public string ExecutionOrder//
        {
            get { return executionOrder; }
            set { SetProperty(ref executionOrder, value); RaisePropertyChanged(); }
        }
        //radiobutton绑定的属性  
        public bool IsOddChecked //选择奇数属性
        {
            get { return isOddChecked; }
            set { SetProperty(ref isOddChecked, value); RaisePropertyChanged(); }
        }
        //radiobutton绑定的属性 
        public bool IsEvenChecked//选择偶数属性
        {
            get { return isEvenChecked; }
            set { SetProperty(ref isEvenChecked, value); RaisePropertyChanged(); }
        }
        //任务名
        public string TaskName
        {
            get { return taskName; }
            set
            {
                taskName = value;
                RaisePropertyChanged();
            }
        }
        //打印的内容:文本框显示的内容
        public string PrintNumbers
        {
            get { return printNumbers; }
            set
            {
                printNumbers = value;
                RaisePropertyChanged();
            }
        }
       //任务数
        public int TaskCount
        {
            get { return taskCount; }
            set { taskCount = value; RaisePropertyChanged(); }
        }
        //主窗体视图模型
          public MainWindowViewModel()
        {
            TasksModel = new TaskModel(); 
            StartButtonCommand = new DelegateCommand(TaskExecutionOrder);
            AddTaskCommand = new DelegateCommand(SelectedTaskExecution);
            ClearAllData = new DelegateCommand(ClearData);
            Task.Run(() => ExecuteTasks());
        }
        //添加(选择的radiobuttion)任务按钮 委托命令   
        private void SelectedTaskExecution()
        {
            if(isEvenChecked)
            {
                Task.Run(()=>EvenNumbers());
            }
            else if(isOddChecked)
            {
                Task.Run(()=>OddNumbers());
            }
            else
            {
                this.PrintNumbers += "Please select any one Task to be executed"+"\n"; 
            }
        }
        //开始按钮委托命令  :执行 奇数、偶数任务
        public void TaskExecutionOrder()
        {
            queue.Enqueue(OddNumbers);
            queue.Enqueue(EvenNumbers);
            taskCount = queue.Count;
        }
        //开始按钮执行异步任务
        private async void ExecuteTasks()
        {
            
            while (true)
            {
                Action task = null;
                lock (queuelock)
                {
                    if (queue.Count > 0)
                    {
                        task = queue.Dequeue();//取出一个任务操作
                    }
                }
                if (task != null)
                {
                    await Task.Run(() =>
                    {
                        task.Invoke();
                        Thread.Sleep(100);
                    });
                }

            }
        }
        //偶数任务操作
        private void EvenNumbers()
        {       //线程池线程 调用UI控件绑定属性
                 Dispatcher.CurrentDispatcher.Invoke(() =>
                {
                    this.PrintNumbers += Environment.NewLine;
                    this.PrintNumbers += Environment.NewLine;
                    this.PrintNumbers += "EvenNumbers between 1 to 100" + Environment.NewLine + "Task:" + " " + taskNumber.ToString();
                    this.PrintNumbers += Environment.NewLine;
                    this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Started " + "\n";

                });

            for (int i = 0; i <= 100; i++)//偶数
            {
                Dispatcher.CurrentDispatcher.Invoke(() =>
                {
                    if (i % 2 == 0)
                    {
                        this.PrintNumbers += i.ToString() + " ";
                        Thread.Sleep(10);
                    }
                });
            }

            this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Stopped" + "\n";
            taskNumber++;
            Thread.Sleep(1000);
        }
        //奇数任务操作
        private void OddNumbers()
        {
                Dispatcher.CurrentDispatcher.Invoke(() =>
               {
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += Environment.NewLine;
                   this.PrintNumbers += "OddNumbers between 1 to 100" + Environment.NewLine + "Task:" + " " + taskNumber.ToString();
                   this.PrintNumbers += Environment.NewLine;
                   this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Started" + "\n";

               });
                for (int i = 0; i <= 100; i++)
                {

                    Dispatcher.CurrentDispatcher.Invoke(() =>
                    {
                        if (i % 2 != 0)//奇数
                        {
                            this.PrintNumbers += i.ToString() + " ";

                            Thread.Sleep(10);
                        }

                    });

                }
                
                this.ExecutionOrder += "Task:" + taskNumber.ToString() + "-Stopped" + "\n";
                taskNumber++;//下一任务号
                Thread.Sleep(1000);
            
        }
        //清空按钮 委托命令
        private void ClearData()
        {
            PrintNumbers = string.Empty;//文本框显示的内容
           
        }
       
    }
}

任务模型 TaskModel.cs----未使用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MultiThreadingWPF.Model 
{
    public class TaskModel : INotifyPropertyChanged
    {
        private string TaskName { get; set; }  //任务名
        private string PrintNumbers { get; set; } //打印的字符串

        public event PropertyChangedEventHandler PropertyChanged; //属性改变事件
    }
}

你可能感兴趣的:(WPF,C#,wpf,ui,c#)