【问题标题】:SynchronizationContext for Tasks [duplicate]任务的 SynchronizationContext [重复]
【发布时间】:2019-10-25 18:58:49
【问题描述】:

my question 的评论表明,“SynchronizationContext”决定了任务是作为单独的线程运行还是在一个线程上运行,但在对this question 的任何回答中都没有提到这一点,也没有提到任务何时实际运行的任何细节在单独的线程上并行或仅在同一线程上运行,但在等待 IO 时可能在它们之间共享工作。

特别是,我正在寻找Thread 对象和Task 对象在此上下文中的比较,无论它们的行为相同还是不同。

“async”和“await”如何连接(或不连接)这也会有所帮助。

举个例子,假设我有两个动作:

f:忙非 IO 循环一秒钟
g:休眠一秒钟

让我们假设我的 CPU 拥有大量可笑的内核。

给定以下代码,无论是h = f,还是h = g,运行时间应该接近一秒吗?

Thread x1 = new Thread(h);
Thread x2 = new Thread(h);
Thread x3 = new Thread(h);
Thread x4 = new Thread(h);
Thread x5 = new Thread(h);
x1.Start();
x2.Start();
x3.Start();
x4.Start();
x5.Start();
x1.Join();
x2.Join();
x3.Join();
x4.Join();
x5.Join();

假设我为任务做了类似的事情:

Task x1 = new Task(h);
Task x2 = new Task(h);
Task x3 = new Task(h);
Task x4 = new Task(h);
Task x5 = new Task(h);
x1.Start();
x2.Start();
x3.Start();
x4.Start();
x5.Start();
x1.Wait();
x2.Wait();
x3.Wait();
x4.Wait();
x5.Wait();

对于h = fh = g 的情况,此任务代码需要多长时间才能运行,如果取决于,什么情况会有所不同以及如何控制它们?

【问题讨论】:

标签: c# .net multithreading task threadpool


【解决方案1】:

特别是,我正在寻找在此上下文中 Thread 对象和 Task 对象之间的比较,无论它们的行为相同还是不同。

它们几乎与您拥有的代码相同。

two different kinds of Tasks:委托任务,运行代码;和 Promise Tasks,代表 Future

您使用Task constructorStart 创建的任务是Delegate Tasks。使用asyncawait 创建的任务是Promise Tasks

委托任务只是代表要运行的代码。它们与线程不同,但它们确实在线程上运行。使用您的示例代码,Start 将启动在TaskScheduler.Current 上运行的这些任务,这可能TaskScheduler.Default 相同,这意味着它们将在线程池上运行。由于您假设内核数量荒谬,那么您的委托任务代码将与手动线程代码基本相同,除了它们在线程池线程而不是您自己的线程上运行。

附带说明,使用Task 构造函数和Start 的级别非常低,甚至没有任何用例;你永远不应该使用Task 构造函数,因为无论你想做什么,总是有更好的解决方案。查看Task Parallel Library documentation 中的高级原语。在你的情况下,你可以用 single line of code 做同样的事情:

Parallel.Invoke(h, h, h, h, h);

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多