假设我有以下代码:public async void Run(){ TaskCompletionSource t = new TaskCompletionSource(); Prepare(t.Task); await Task.Delay(1000); t.SetResult(); Console.
假设我有这样的代码:
public async void Run()
{
TaskCompletionSource t = new TaskCompletionSource();
Prepare(t.Task);
await Task.Delay(1000);
t.SetResult();
Console.WriteLine("End");
}
public async void Prepare(Task task)
{
await Run(task, "A");
await Run(task, "B");
await Run(task, "C");
await Run(task, "D");
}
public async Task Run(Task requisite, string text)
{
await requisite;
Console.WriteLine(text);
}
时会发生什么 t.SetResult();
?这是多线程吗?控制台中项目的顺序有任何保证吗?如果我有一个 List<>
,并且该 Run
方法会改变它,我需要担心多线程吗?
SetResult()
内部 await
恢复执行 Run(Task, string)
并打印\'A\'。然后返回到 Prepare()
, await Run(task, "B")
将打印\'B\'。依此类推。最后将按顺序打印\'ABCD\'。
TaskScheduler
当前环境中使用的内容以及在此调度程序上执行的其他任务。默认情况下,您将拥有一个包含多个线程的线程池。最有可能(但不保证)您的任务将在不同的线程上执行,但不会并行执行(如果我们谈论的是 ABCD 任务)。
await
在开始下一个任务之前先完成当前任务。
List<>
内部 Run
- 这很可能可行,因为没有 并发 编辑。同时这绝对是脆弱的代码,在未来的代码修改过程中可能会轻易被悄悄破坏。我将尽量避免这样的代码,并使用 locks
或一些并发集合。或者至少写一个长注释来描述当前实现的局限性。