gpt4 book ai didi

c# - .NET 异步,单线程可以在任务之间划分时间片吗?

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:49 25 4
gpt4 key购买 nike

我正在尝试掌握 C#/.NET 中的异步编程。我在布朗大学网站上阅读了一篇关于 cs168 类(class)的文章 ( link ),该文章将异步编程定义为同一线程中的交错任务。它说,“现在我们可以引入异步模型......在这个模型中,任务相互交错,但在一个控制线程中”,并在图中非常清楚地显示了交错。但我似乎无法让两个任务在 .NET 的同一个线程中交错。有办法吗?

我编写了一些简单的应用程序来尝试测试这个理论,但我不确定我是否做对了。主程序每隔一段时间就输出到屏幕上,使用Thread.Sleep()来模拟工作。异步任务做同样的事情。如果使用多个线程,则输出是交错的。但我正在尝试在单个线程上进行测试。

我有一个 WPF 应用程序,它在 UI 线程上运行所有内容,但任务和主程序始终按顺序输出。我这样创建并启动任务:

var taskFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
var task = taskFactory.StartNew(workDelegate);

我有一个控制台应用程序,它使用 Task.Run(workDelegate); 启动任务委托(delegate),但在不同的线程池线程上运行它们。我不确定如何让它们在同一个线程上运行。如果我尝试使用我在 WPF 中使用的相同方法,我会收到运行时 InvalidOperationException,“当前 SynchronizationContext 可能无法用作 TaskScheduler”。

最佳答案

多个任务不会在单个线程上自动交错。为此,您必须在任务代码中指定允许线程切换到另一个任务的点。您可以通过类似 await Task.Yield 的机制来执行此操作.如果您在单个线程上运行,则该线程将无法让其他工作继续进行,除非它明确让步。

当您使用 TaskScheduler 启动每个任务时,WPF 中的消息泵会安排每个任务在 UI 线程上运行,并且它们将按顺序运行。

I have a console app that starts the task delegate using Task.Run(workDelegate);, but that runs them on different thread pool threads. I'm not sure how to make them both run on the same thread.

您需要将自定义 SynchronizationContext 安装到线程中,以便您可以将工作发布到该线程。

关于c# - .NET 异步,单线程可以在任务之间划分时间片吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16549771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com