WPF异步任务
主界面
//打印的内容:文本框显示的内容
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绑定的属性
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);
}
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;//文本框显示的内容
}
}
}
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; //属性改变事件
}
}