1.Thread
ThreadStart threadStart = Dowork1;
Thread thread = new Thread(threadStart);
thread.Start();
//do something in main
thread.Join();// wait thread run to end
private static void Dowork1()
{
for(int i = 0; i<12000;i++)
Console.WriteLine("ssss");
}
1.1 线程只能承诺尝试终止线程,但是不保证成功。
1.2 被终止时lock对象被释放,释放后程序其他线程访问,从而线程变的不安全
1.3 线程终止时,CLR可以保证自己的内部数据结构不被破坏,但BCL没有能力保证。其他线程访问破坏的数据会造成严重问题
2.线程池
ThreadPool.QueueUserWorkItem(Dowork, "+");
for (int count = 0; count < Repeat; count++)
{
Console.Write("-");
}
Thread.Sleep(1000);
private static void Dowork(object state)
{
for (int count = 0; count < Repeat; count++)
{
Console.Write(state);
}
}
2.1 (优点)线程池能够减少线程分配的开销,
2.2 (缺点)线程池 内任务时间都较短
2.2 (缺点)线程池不能管理线程管理和同步
3.异步任务
3.1 监视异步操作的状态,知道它何时完成
3.2 线程池, 避免启动和终止线程的巨大开销
3.3 避免死锁
3.4 为不同的操作提供原子性 并同步数据访问
// 1. 无返回值的Task
Task task = Task.Run(() =>
{
for (int i = 0; i < 1000; i++)
{
Console.WriteLine("1");
}
});
for (int i = 0; i < 1000; i++)
{
Console.WriteLine("2");
}
task.Wait();// wait task run to end
// 2. 有返回值的Task
Task<string> task1 = Task.Run<string>(
() => PiCalculater.Calculate(100));
for (int i = 0; i < 10000; i++)
{
if (task1.IsCompleted)
{
Console.WriteLine("completed");
break;
}
else
{
Console.WriteLine(">");
}
}
Console.WriteLine(task1.Result);
3.5 Task 的状态可以使用 status 来获得,Created,WaitingForActivation, WaitingToRun,Running,WaitingForChildrenToComplete ,RanToCompletion ,Canceled ,Faulted,(isComplete == true)
3.6 Task.CurrentId
3.7
Task taskA = Task.Run(
() => Console.WriteLine("Starting..."))
.ContinueWith(
antecedent=>Console.WriteLine("Continuing A...")
);
// B 和 C 的顺序并不一定,他们时**并列**的
Task taskB = taskA.ContinueWith(
antecedent => Console.WriteLine("Continuing B..."));
Task taskC = taskA.ContinueWith(
antecedent => Console.WriteLine("Continuing C..."));
Task.WaitAll(taskB, taskC);
// Task 链接的条件
Task<string> task = Task.Run<string>(
() => {
return "Start ..."; });
Task faultedTask = task.ContinueWith(
(antecedentTask) =>
{
Trace.Assert(antecedentTask.IsFaulted);
Console.WriteLine("Task State Faulted");
},
TaskContinuationOptions.OnlyOnFaulted
);
Task canceledTask = task.ContinueWith(
(antecedentTask) =>
{
Trace.Assert(antecedentTask.IsCanceled);
Console.WriteLine("Task State:Canceled");
},
TaskContinuationOptions.OnlyOnCanceled
);
Task completedTask = task.ContinueWith(
(antecedentTask) =>
{
Trace.Assert(antecedentTask.IsCompleted);
Console.WriteLine("Task State:Complete");
},
TaskContinuationOptions.OnlyOnRanToCompletion
);
//task 完成时线程已经退出了,不能沿着链条向下传递
//task.Wait();
// 不管
Task.WaitAny(completedTask, canceledTask, faultedTask);
//completedTask.Wait();