首页 > Windows开发 > 详细

c#任务---Task

时间:2015-10-22 13:47:14      阅读:672      评论:0      收藏:0      [点我收藏+]
1、Task和Task<TResult>是c#提供的一种实现异步功能的2个类。异步是相对同步而言,是功能性的概念。一般在硬件系统好理解一点,比如显卡,网卡等,都是需要实现一种功能,然后返回给操作系统。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。通过多线程可以实现异步的功能。

2、Task<TResult>继承与Task 类。Task 类继承三个接口。public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable。IAsyncResult负责定义异步状态,同步方法等。
3、Task使用步骤: 创建任务,开始任务start(),等待任务,获取任务结果 。Task<TResult>是有参数的版本。方法体是Func<TResult>
3.1 创建任务
可以创建两种方法体的任务。一种是Action类型的委托。即:无返回值,但有任意参数的方法。一种是Func类型的委托。即有返回值,但无参的方法。
Action类型的任务构造函数8个:
public Task(Action action);
public Task(Action<object> action, object state);
public Task(Action action, CancellationToken cancellationToken);
public Task(Action action, TaskCreationOptions creationOptions);//可创建子任务
public Task(Action<object> action, object state, CancellationToken cancellationToken);
public Task(Action<object> action, object state, TaskCreationOptions creationOptions);
public Task(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions);
public Task(Action<object> action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions);
Func类型的任务构造函数也有8个

public Task(Func<TResult> function);
public Task(Func<object, TResult> function, object state);

public Task(Func<TResult> function, CancellationToken cancellationToken);
public Task(Func<TResult> function, TaskCreationOptions creationOptions);

public Task(Func<object, TResult> function, object state, CancellationToken cancellationToken);

public Task(Func<object, TResult> function, object state, TaskCreationOptions creationOptions);

public Task(Func<TResult> function, CancellationToken cancellationToken, TaskCreationOptions creationOptions);

public Task(Func<object, TResult> function, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions);
利用静态方法: Task.Run( ()=>{
Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");}
);
【利用构造函数
Task task = new Task(() => {
int sum=0;
Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");
for (int i = 0; i < 10; i++)
{
sum =+ i;
}
return sum;
});
//启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)
task.Start();
//等待任务的完成执行过程。这里有两种方法,一种,使用已创建任务的Wait方法。会在这里形成阻塞
task.Wait();
【另一种不会形成阻塞的方法:使用已创建任务的ContinueWith方法。作用:任务完成后,再开启另外一个任务,对结果进行处理。

Task cwt = task.ContinueWith(t => {
Console.WriteLine("任务完成后的执行结果:{0}", t.Result.ToString());
});

//获得任务的执行结果
Console.WriteLine("任务执行结果:{0}", task.Result.ToString());

4、任务嵌套。父任务,子任务。
通过Task类创建的任务是顶级任务,可以通过使用 TaskCreationOptions.AttachedToParent 标识把这些任务与创建他的任务相关联,所有子任务全部完成以后父任务才会结束操作。示例如下:
1: static void ParentChildTask() {
2: Task<string[]> parent = new Task<string[]>(state => {
3: Console.WriteLine(state);
4: string[] result=new string[2];
5: //创建并启动子任务
6: new Task(() => { result[0]= "我是子任务1。"; },TaskCreationOptions.AttachedToParent).Start();
7: new Task(() => { result[1] = "我是子任务2。"; }, TaskCreationOptions.AttachedToParent).Start();
8: return result;
9: },"我是父任务,并在我的处理过程中创建多个子任务,所有子任务完成以后我才会结束执行。");
10: //任务处理完成后执行的操作
11: parent.ContinueWith(t => {
12: Array.ForEach(t.Result, r=>Console.WriteLine(r));
13: });
14: //启动父任务
15: parent.Start();
16: Console.Read();
17: }
如果需要创建一组具有相同状态的任务时,可以使用TaskFactory类或TaskFactory<TResult>类。这两个类创建一组任务时可以指定任务的CancellationToken、TaskCreationOptions、TaskContinuationOptions和TaskScheduler默认值。示例代码:
1: static void TaskFactoryApply()
2: {
3: Task parent = new Task(() =>
4: {
5: CancellationTokenSource cts = new CancellationTokenSource(5000);
6: //创建任务工厂
7: TaskFactory tf = new TaskFactory(cts.Token, TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
8: //添加一组具有相同状态的子任务
9: Task[] task = new Task[]{
10: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第一个任务。"); }),
11: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第二个任务。"); }),
12: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第三个任务。"); })
13: };
14: });
15: parent.Start();
16: Console.Read();
17: }

 

c#任务---Task

原文:http://www.cnblogs.com/crhdyl/p/4900449.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!