可取消可报告进度的Task
2024-09-05 10:51:29
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp2
{
public partial class MainWindow : Window
{
CancellationTokenSource Cts = new CancellationTokenSource();
public MainWindow()
{
Person p = new Person();
p.Do(Cts.Token, new Progress<int>((xpp)=>label.Content=xpp));
}
/// <summary>
/// 按钮按下事件处理函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click(object sender, RoutedEventArgs e)
{
Cts.Cancel();
}
}
public class Person
{
public string name { get; set; }
public string age { get; set; }
public int length { get; set; }
public void Do(CancellationToken token, IProgress<int> progress)
{
Action action = new Action(() =>
{
try
{
for (int i = 0; i < 30; i++)
{
Thread.Sleep(1000);
//报告进度
progress.Report(i);
//如果用户执行CancellationTokenSource.Cancel()方法就抛出异常
//从而达到取消线程操作
token.ThrowIfCancellationRequested();
}
}
catch (Exception)
{
Console.WriteLine("取消线程执行");
}
});
Task task = new Task(action,token);
task.Start();
}
}
}
这里有一点需要说明,那就是Progress实际上是跨线程修改控件,去system.Progress源码中找到Report的源码中调用了OnReport函数,如下图:
m_synchronizationContext变量是个SynchronizationContext类型,用于线程间通信。
最新文章
- 在阿里云中编译Linux4.5.0内核 - Ubuntu内核编译教程
- c——I/O Multiplexing笔记
- ural One-two, One-two 2
- import tf
- Eclipse c++头文件问题(未完)
- java变量作用域
- activiti自定义流程之自定义表单(二):创建表单
- poj 1269 Intersecting Lines
- UIPickerView实现省 市 区三级联动
- ##5.2 Nova计算节点-- openstack pike
- C# httpclient获取cookies实现模拟web登录
- [poj1279]Art Gallery
- 测试修改hosts文件py小工具
- numpy中的stack操作:hstack()、vstack()、stack()、dstack()、vsplit()、concatenate()
- iOS QRcode识别及相册图片二维码读取识别
- Cocos Creator - 入门教程项目 - 博客频道 - CSDN.NET
- Structs+Spring+Hibernate快速入门
- java包的所有类生成class
- COM,SOM, QT, GObject, ObjectiveC
- Linq的常见查询