C# Task(任务调度)

案例一、执行顺序
//后执行,说明只是允许 Task t = new Task(() =>}) 这行代码,并不等待过程
Task t = new Task(() =>
{
System.Windows.Application.Current.Dispatcher.Invoke(() => {
Thread.Sleep(5000);
this.Title = "hello";
});
});
task.Start();
//先执行
this.Title = "hi";

任务Task创建方式
方式一、
Task task = new Task(() =>{});
task.Start();

有返回值的方式
先执行Task
Task<int> task = new Task<int>(() => {
return 0;
});
其次执行ContinueWith
task.ContinueWith(t =>
{
int result = t.Result;
});
task.Start();

方式二、
var t = new Task(() => TaskMethod("Task 2"));
t.Start();

方式三、
Task.Run(() => TaskMethod("Task 3"));

方式四、直接异步的方法
Task.Factory.StartNew(() => TaskMethod("Task 3"));

Task任务并行
List<Task> taskList = new List<Task>();
taskList.Add(Task.Run(() =>
{

}));
taskList.Add(Task.Run(() =>
{

}));
taskList.Add(Task.Run(() =>
{

}));
//主线程阻塞,等待结束
Task.WaitAll(taskList.ToArray());
主线程 Code ....执行

方式三、异步非阻塞
Task[] tlist = new Task[] {
Task.Factory.StartNew(() => {
Thread.Sleep(3000);
}),
Task.Factory.StartNew(() => {
Thread.Sleep(90000);
})
};
Task.WhenAny(tlist).ContinueWith((s) => {
return s;
});

使用IProgress实现异步编程的进程通知
private void btnSub_Click(object sender, RoutedEventArgs e)
{
Task task = Display();
}
void DoProcessing(IProgress<int> progress)
{
if (progress != null)
{
progress.Report(1);
}
}

async Task Display()
{
//当前线程
var progress = new Progress<int>(percent =>
{
this.Title = percent.ToString();
});
//线程池线程
await Task.Run(() => DoProcessing(progress));
}

C# Task(任务调度)

上一篇:Windows添加删除 route


下一篇:win10开机自启脚本