开启多线程
{
Task task = new Task(() =>
{
this.DoSomethingLong("btnTask_Click_1")
});
task.Start();
}
{
Task task = Task.Run(() => this.DoSomethingLong("btnTask_Click_2"));
}
{
TaskFactory taskFactory = Task.Factory;
Task task = taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click_3"));
}
Task分配的任务是来自于线程池
{
ThreadPool.SetMaxThreads(13, 13);
List<int> countlist = new List<int>();
List<Task> tasklist = new List<Task>();
for (int i = 0; i < 100; i++)
{
int k = i;
tasklist.Add(Task.Run(() =>
{
Console.WriteLine($"This is {k} running ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(2000);
countlist.Add(Thread.CurrentThread.ManagedThreadId);
}));
}
Task.WaitAll(tasklist.ToArray());
Console.WriteLine(countlist.Distinct().Count());
}
父子线程
- :默认行为,与Task无参数一样。
- :以一种尽可能公平的方式安排任务,这意味着较早安排的任务将更可能较早运行,而较晚安排运行的任务将更可能较晚运行。
- :指定某个任务将是运行时间长、粗粒度的操作。 它会向 提示,过度订阅可能是合理的。
- :指定将任务附加到任务层次结构中的某个父级,父任务必须等待所有子任务执行完毕才能执行
Task task = new Task(() =>
{
Console.WriteLine($"****************task: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
}, TaskCreationOptions.PreferFairness);
Task task1 = new Task(() =>
{
Console.WriteLine($"****************task: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
}, TaskCreationOptions.PreferFairness);
Console.WriteLine($"****************UI线程: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
Task task = new Task(() =>
{
Console.WriteLine($"****************task: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
},TaskCreationOptions.LongRunning);
Task task = new Task(() =>
{
Console.WriteLine($"****************task开始了: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
Task task1 = new Task(() =>
{
Console.WriteLine($"****************task1: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
Thread.Sleep(1000);
Console.WriteLine("我是task1线程");
}, TaskCreationOptions.AttachedToParent);
Task task2 = new Task(() =>
{
Console.WriteLine($"****************task2: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
Thread.Sleep(1000);
Console.WriteLine("我是task2线程");
}, TaskCreationOptions.AttachedToParent);
task1.Start();
task2.Start();
Console.WriteLine($"****************task: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
});
task.Start();
task.Wait();
Console.WriteLine($"****************UI线程: {Thread.CurrentThread.ManagedThreadId.ToString("00")} ***************");
Sleep和Delay的区别
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine("在Sleep之前");
Thread.Sleep(2000);
Console.WriteLine("在Sleep之后");
stopwatch.Stop();
Console.WriteLine($"Sleep耗时{stopwatch.ElapsedMilliseconds}");
}
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine("在Delay之前");
Task task = Task.Delay(2000)
.ContinueWith(t =>
{
stopwatch.Stop();
Console.WriteLine($"Delay耗时{stopwatch.ElapsedMilliseconds}");
Console.WriteLine($"This is ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
Console.WriteLine("在Delay之后");
}
ContinueWhenAny/ContinueWhenAll/WaitAny/WaitAll等用法
{
TaskFactory taskFactory = new TaskFactory();
List<Task> taskList = new List<Task>();
taskList.Add(taskFactory.StartNew(() => this.Coding("冰封的心", "Portal")));
taskList.Add(taskFactory.StartNew(() => this.Coding("随心随缘", " DBA ")));
taskList.Add(taskFactory.StartNew(() => this.Coding("心如迷醉", "Client")));
taskList.Add(taskFactory.StartNew(() => this.Coding("千年虫", "BackService")));
taskList.Add(taskFactory.StartNew(() => this.Coding("简单生活", "Wechat")));
taskFactory.ContinueWhenAny(taskList.ToArray(), t => Console.WriteLine($"XXX开发完成,获取个红包奖励{Thread.CurrentThread.ManagedThreadId.ToString("00")}"));
taskList.Add(taskFactory.ContinueWhenAll(taskList.ToArray(), rArray => Console.WriteLine($"开发都完成,一起庆祝一下{Thread.CurrentThread.ManagedThreadId.ToString("00")}")));
Task.WaitAny(taskList.ToArray());
Console.WriteLine("准备环境开始部署");
Task.WaitAll(taskList.ToArray());
Console.WriteLine("5个模块全部完成后,集中点评");
}
控制线程数量
{
List<Task> taskList = new List<Task>();
for (int i = 0; i < 10000; i++)
{
int k = i;
if (taskList.Count(t => t.Status != TaskStatus.RanToCompletion) >= 20)
{
Task.WaitAny(taskList.ToArray());
taskList = taskList.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();
}
taskList.Add(Task.Run(() =>
{
Console.WriteLine($"This is {k} running ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(2000);
}));
}
}
ContinueWith回调
{
Task.Run(() => this.DoSomethingLong("btnTask_Click")).ContinueWith(t => Console.WriteLine($"btnTask_Click已完成{Thread.CurrentThread.ManagedThreadId.ToString("00")}"));
}
带参数的Task任务
{
Task<int> result = Task.Run<int>(() =>
{
Thread.Sleep(2000);
return DateTime.Now.Year;
});
int i = result.Result;
}
{
Task.Run<int>(() =>
{
Thread.Sleep(2000);
return DateTime.Now.Year;
}).ContinueWith(tInt =>
{
int i = tInt.Result;
});
}