创建线程
第一种方法(无返回值):var task=new Task(...);
static void Main(string[] args)//主线程
{
var task = new Task(()=>
{
for(int i=0;i<500;i++)
{
Console.WriteLine("---");
}
});
task.Start();
task.Wait();
Console.Read();
}
第二种方法(返回值可有可无):var task=Task.Factory.StartNew(...);
static void Main(string[] args)//主线程
{
//获取返回值的线程
var task = Task.Factory.StartNew(()=>"1");
Console.WriteLine(task.Result);//task.Result自带阻塞效果,直接执行,无需start()
Console.Read();
}
异常捕获与处理
方法一:
static void Main(string[] args)//主线程
{
var task = Task.Factory.StartNew(()=> { throw new ApplicationException("here is a erro"); });
try
{
task.Wait();
}
catch(AggregateException exs)
{
foreach(var ex in exs.InnerExceptions)
{
Console.WriteLine(ex.Message);
}
}
Console.Read();
}
方法二:ContinueWith();
static void Main(string[] args)//主线程
{
var task = Task.Factory.StartNew(()=> { throw new ApplicationException("here is a erro"); });
task.ContinueWith((t) => { Console.WriteLine(t.Exception); }, TaskContinuationOptions.OnlyOnFaulted);//t指前一个线程的引用
Console.Read();
}
并行处理
Parallel.For()
Parallel.ForEach()
PLINQ----x.AsParallel().x
static void Main(string[] args)//主线程
{
var list=new List<int>();
for (int i = 0; i < 5000000; i++)
{
list.Add(i);
}
CalcTime(() => list.ForEach(i => i++));
CalcTime(() => list.AsParallel().ForAll(i => i++));
CalcTime(()=>Parallel.ForEach(list, i => i++));
Console.Read();
}
private static void CalcTime(Action action)
{
Stopwatch sw = new Stopwatch();
sw.Start();
action();
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
同步进行两个线程切换执行
class Program
{
static int count=0;
static void Main(string[] args)//主线程
{
var task1 = new Task(Increment);
var task2 = new Task(Decrement);
task1.Start();
task2.Start();
Task.WaitAll(task1, task2);
Console.WriteLine(count);
Console.Read();
}
static void Increment()
{
for(int i=0;i<5000000;i++)
{
count++;
}
}
static void Decrement()
{
for (int i = 0; i < 50000000; i++)
{
count--;
}
}
}
对上述代码进行原子封装操作:InterLocked,就不会再交替执行,类似于数据库的上锁
class Program
{
static int count=0;
static void Main(string[] args)//主线程
{
var task1 = new Task(Increment);
var task2 = new Task(Decrement);
task1.Start();
task2.Start();
Task.WaitAll(task1, task2);
Console.WriteLine(count);
Console.Read();
}
static void Increment()
{
for(int i=0;i<5000000;i++)
{
Interlocked.Increment(ref count);
}
}
static void Decrement()
{
for (int i = 0; i < 5000000; i++)
{
Interlocked.Decrement(ref count);
}
}
}