Task用法小记
闲来无事
学点新知识
之前就看过Task见过类似的用法
就是没有特意的去了解这个类
今天来了解下顺便记个笔记、、、
本质
Task是一个类,它是基于任务的异步模式而产生的
首次引入在Framework 4中
看到这里你一定会想到多线程Thread与线程池ThreadPool
而Task跟线程池的功能是很相似的
当我们用Task开启新任务的时候,系统会从线程池中调用线程
而Thread会在每次实例化的时候创建一个新的线程
如果你需要一个长时间的操作,请使用Task(Acton,TaskCreationOptions)构造函数中的
TaskCreationOptions.LongRunning,暗示任务调度器,将这个线程放在非线程池上执行
Task的启动方式
Start
New Task(Action)
class Program
{
static void Main(string[] args)
{
Task t = new Task(DoA);
t.Start();
Console.ReadKey();
}
static void DoA()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("i={0}\n", i);
}
}
}
Run
Task.Run(Action)
static void Main(string[] args)
{
Task.Run(() =>
{
for (int i = 0; i < 50; i++)
{
Console.WriteLine("i={0}",i);
}
});
Console.ReadKey();
}
具有返回值的Task
Task.Run
Task<int> task = Task.Run<int>(() =>
{
int sum = 0;
for (int i = 0; i < 50; i++)
{
sum += 1;
}
return sum;
});
int result = task.Result;
Console.WriteLine("运算结果是:{0}",result);//输出50
Console.ReadKey();
Factory
Task.Factory.StartNew(Action)
Task t = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("i={0}", i);
}
});
Task中的wait
基本用法
默认情况下,Task 是有线程池中的异步线程执行
是否执行完成,可以通过Task的的属性IsCompleted 来判断
如果想在子线程工作完成之后,在进行后续主线程工作可以通过调用task.Wait() 来等待线程完成
调用Wait后,当前线程会被阻塞,直到到子线程完成
static void Main(string[] args)
{
Task t = Task.Run(() =>
{
Thread.Sleep(500);
Console.WriteLine("Lance");
Thread.Sleep(500);
});
Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
t.Wait();
Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
}
运行结果:
具有等待时间的Wait
static void Main(string[] args)
{
Task t = Task.Run(() =>
{
Thread.Sleep(500);
Console.WriteLine("Lance");
Thread.Sleep(500);
});
Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
bool IsComplate= t.Wait(200);
Console.WriteLine("wait 200毫秒后 t.IsCompleted=" + t.IsCompleted);
Thread.Sleep(1000);
Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
}
运行结果:
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自耕田日记
评论