一:Task
1. 最简单的使用
开启task有两种方式:
<1> 实例化Task
var task1 = new Task(() =>
{
StartAdd();
});
task1.Start();
public static void StartAdd()
{
string value = null;
for (int i = 0; i < 1000; i++)
{
td.TryAdd(i, i.ToString());
}
for (int i = 0; i < 1000; i++)
{
td.TryGetValue(i, out value);
Console.WriteLine(value);
}
}
<2>从工厂中创建
Task.Factory.StartNew(() => Console.WriteLine("1"));
var task2 = Task.Factory.StartNew(() =>
{
StartAdd();
});
Task的waitAny和waitAll方法
var tasks = new Task[3];
for (int i = 0; i < tasks.Length; i++)
{
int taskIndex = i;
tasks[i] = Task.Factory.StartNew(() =>
{
int seed = Guid.NewGuid().GetHashCode();
int waitTime = new Random(seed).Next(10, 100);
Thread.Sleep(waitTime);
Console.WriteLine("Task{0} Finished", taskIndex);
});
}
Task.WaitAny(tasks);
Console.WriteLine("Here is one job finish");
取消一个Task
创建一个取消的Task一般要进行下面一些步骤:
a.创建System.Threading.CancellationTokenSource的一个实例:
b.通过CancellationTokenSource.Token属性获得一个System.Threading.CancellationToken:
c.创建一个新的Task或者Task<T>,并且在构造函数传入Action或者Action<object>的委托作为第一个参数,传入CancellationToken作为第二个参数:
var cancelTokenSource = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
while (!cancelTokenSource.IsCancellationRequested)
{
Console.WriteLine(DateTime.Now);
Thread.Sleep(1000);
}
}, cancelTokenSource.Token);
Console.WriteLine("Press any key to cancel");
Console.ReadLine();
cancelTokenSource.Cancel();
Console.WriteLine("Done");
Console.ReadLine();