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

C# NET异步,单个线程可以在任务之间划分时间片吗?,c#,.net,asynchronous,C#,.net,Asynchronous,我试图掌握C#/.NET中的异步编程。我在布朗大学的网站上读了一篇关于cs168课程的文章(),该课程将异步编程定义为在同一线程内交错任务。它说,“现在我们可以引入异步模型……在这个模型中,任务彼此交错,但是在一个控制线程中”,并且在一个图中非常清楚地显示了交错。但是在.NET中,我似乎无法让两个任务在同一个线程中交错。有办法吗 我写了一些简单的应用程序来测试这个理论,但我不确定我是否做对了。主程序每隔一段时间输出到屏幕,使用Thread.Sleep()模拟工作。异步任务也会这样做。如果使用多个

我试图掌握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”。

您不能在同一线程池线程中运行两个并发任务。每个线程池线程一次可以运行一个任务。如果您想在一个线程中完成两件事,您的选项如下: 1.将这两件事合并为一项任务 2.创建两个任务,其中一个任务将依赖于另一个任务。因此,最终它们会依次运行。默认情况下,虽然不能保证它们会在同一个线程中运行,但无论如何,您不应该依赖于此


我不清楚你想做什么。根据书中所述,用户界面和WPF的线程应该能够完成任何繁重的数字处理工作。它应该负责UI并组织工作线程/任务。您可以在后台使用异步启动操作。

您不能在同一线程池线程中运行两个并发任务。每个线程池线程一次可以运行一个任务。如果您想在一个线程中完成两件事,您的选项如下: 1.将这两件事合并为一项任务 2.创建两个任务,其中一个任务将依赖于另一个任务。因此,最终它们会依次运行。默认情况下,虽然不能保证它们会在同一个线程中运行,但无论如何,您不应该依赖于此


我不清楚你想做什么。根据书中所述,用户界面和WPF的线程应该能够完成任何繁重的数字处理工作。它应该负责UI并组织工作线程/任务。您可以在后台使用异步启动操作。

多个任务不会在单个线程上自动交错。为此,必须在任务代码中指定允许线程切换到另一个任务的点。你可以通过这样的机制来实现。如果您在单个线程上运行,该线程将无法允许其他工作进行,除非它显式地让步

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

我有一个控制台应用程序,可以使用task.Run(workDelegate)启动任务委托;,但这会在不同的线程池线程上运行它们。我不知道如何让它们在同一个线程上运行


您需要将自定义的同步上下文安装到一个线程中,该线程允许您将工作发布到该线程。

多个任务不会在单个线程上自动交错。为此,必须在任务代码中指定允许线程切换到另一个任务的点。你可以通过这样的机制来实现。如果您在单个线程上运行,该线程将无法允许其他工作进行,除非它显式地让步

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

我有一个控制台应用程序,可以使用task.Run(workDelegate)启动任务委托;,但这会在不同的线程池线程上运行它们。我不知道如何让它们在同一个线程上运行


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

您确定吗?我这样问是因为布朗大学网站上一篇关于cs168课程的文章将异步编程定义为在同一线程内交错任务。它说,“现在我们可以引入异步模型,如图3所示……在这个模型中,任务彼此交错,但在一个控制线程中”,并且在图中非常清楚地显示了交错。这篇文章在我的问题中有链接,但我应该更好地指出它(我将更新它)。我很惊讶.NET不支持交错,但仍然尝试称之为“异步编程”。@JohnB是的,我肯定。世界上有很多关于“异步”的定义。他们定义了异步编程==协作多任务,其中“在异步模型下,任务将继续运行,直到它显式地将控制权交给其他任务。”.NET使用异步(更广泛)术语,类似于@JohnB,在语言/术语方面总是有一些困难,特别是当你开始观察学术界与世界其他地区的对比时(例如,学术界的并行性和并发性之间存在巨大差异,但在大多数“真实世界”的使用中,它们被视为等价的),术语很少