. net异步,可以在任务之间进行单线程时间切片

本文关键字:单线程 时间 切片 之间 任务 异步 net | 更新日期: 2023-09-27 18:13:25

我正在尝试掌握c#/. net中的异步编程。我在布朗大学网站上读到一篇关于cs168课程的文章(链接),该文章将异步编程定义为同一线程内的交叉任务。它说,"现在我们可以引入异步模型……在这个模型中,任务是相互交错的,但在一个单一的控制线程中,并且在图中非常清楚地显示了交错。但我似乎不能得到两个任务交织在同一个线程在。net。有办法做到吗?

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

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

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

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

. net异步,可以在任务之间进行单线程时间切片

多个任务不会自动交织在一个线程上。要做到这一点,您必须在任务代码中指定允许线程切换到另一个任务的点。你可以通过像await Task.Yield这样的机制来做到这一点。如果你在一个线程上运行,该线程将不能允许其他工作进行,除非它显式地产生。

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

我有一个控制台应用程序,它使用task . run (workDelegate);启动任务委托,但在不同的线程池线程上运行它们。我不确定如何使它们都在同一个线程上运行。

你需要安装一个自定义的SynchronizationContext到一个线程,允许你发布工作到该线程。

不能在同一个线程池线程中运行两个并发任务。每个线程池线程一次只能运行一个Task。如果你想在一个线程中做两件事,你的选择是我现在看到的:1. 把这两件事合并成一个任务2. 创建两个任务,其中一个将依赖于另一个。所以最后他们会一个接一个地跑。默认情况下,不能保证它们会在同一个线程中运行,但无论如何你都不应该依赖它。

我不清楚你想做什么。根据这些书,UI和WPF的线程应该完成任何繁重的数字处理工作。它应该负责UI并组织工作线程/任务。您可以使用async.
在后台启动操作。