我试图掌握 C#/.NET 中的异步编程。我在布朗大学网站上阅读了一篇关于 cs168 课程的文章(链接),该课程将异步编程定义为同一线程中的交错任务。它说,“现在我们可以引入异步模型......在这个模型中,任务是相互交错的,但在一个控制线程中”,并在图中非常清楚地显示了交错。但我似乎无法让两个任务在 .NET 的同一个线程中交错。有没有办法做到这一点?
我写了一些简单的应用程序来尝试测试这个理论,但我不确定我是否做得正确。主程序每隔一段时间输出到屏幕上,Thread.Sleep()
用来模拟工作。异步任务也是如此。如果使用多个线程,则输出是交错的。但我正在尝试在单个线程上进行测试。
我有一个在 UI 线程上运行所有内容的 WPF 应用程序,但任务和主程序始终按顺序输出。我创建并启动这样的任务:
var taskFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
var task = taskFactory.StartNew(workDelegate);
我有一个控制台应用程序,它使用 启动任务委托Task.Run(workDelegate);
,但在不同的线程池线程上运行它们。我不确定如何让它们都在同一个线程上运行。如果我尝试在 WPF 中使用的相同方法,则会收到运行时 InvalidOperationException,“当前 SynchronizationContext 可能无法用作 TaskScheduler”。