8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

当多个 C# 任务在另一个任务完成时启动时会发生什么?

blogofsongs 2月前

70 0

假设我有以下代码: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 方法会改变它,我需要担心多线程吗?

帖子版权声明 1、本帖标题:当多个 C# 任务在另一个任务完成时启动时会发生什么?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由blogofsongs在本站《multithreading》版块原创发布, 转载请注明出处!
最新回复 (0)
    1. SetResult() 内部 await 恢复执行 Run(Task, string) 并打印\'A\'。然后返回到 Prepare() await Run(task, "B") 将打印\'B\'。依此类推。最后将按顺序打印\'ABCD\'。
    2. 您无法确定它是否是多线程的。这取决于 TaskScheduler 当前环境中使用的内容以及在此调度程序上执行的其他任务。默认情况下,您将拥有一个包含多个线程的线程池。最有可能(但不保证)您的任务将在不同的线程上执行,但不会并行执行(如果我们谈论的是 ABCD 任务)。
    3. ABCD 的顺序是有保证的,因为您 await 在开始下一个任务之前先完成当前任务。
    4. 关于修改 List<> 内部 Run - 这很可能可行,因为没有 并发 编辑。同时这绝对是脆弱的代码,在未来的代码修改过程中可能会轻易被悄悄破坏。我将尽量避免这样的代码,并使用 locks 或一些并发集合。或者至少写一个长注释来描述当前实现的局限性。
返回
作者最近主题: