【问题标题】:Some questions about threading关于线程的一些问题
【发布时间】:2023-04-02 22:28:01
【问题描述】:

我是并行编程、线程、任务等方面的新手。所以,前几天我正在阅读这本书,这本书向我介绍了线程。它没有很好地解释它,所以我有点迷失在这个概念中。我有几个问题:

  1. 线程默认是异步的吗?因为,当我们运行多个线程时,它会运行并且不会停止任何其他线程或任务,我猜它们是异步的。

  2. 聚合异常是如何工作的?我的意思是我们如何处理它,它是如何发生的?请举个例子。

  3. 什么是同步上下文?我在网上查了很多关于它的定义。有些人试图使用聪明的发音词,这只会在我的大脑中引起混乱。

我听说所有这些概念都很复杂。复杂性促使我进一步了解它。

【问题讨论】:

标签: c# multithreading task


【解决方案1】:

简单来说:

  1. 是的,默认情况下它们是异步的,因为内部基于抢占式多任务机制。也就是说,如果您不应用显式同步机制(如互斥锁、临界区、信号量等),使线程排队进入“执行队列”,那么在执行的任何点,线程都可能被另一个线程的执行“中断” “当他们同步到达一个点时。所以是的,一个线程不会停止其他线程,除非它们遇到相同的同步对象。

  2. AggregateException 只是一种包装来自父任务的子任务的多个异常的机制。如果从该任务内部执行任务,并且如果这些子任务被指定为附加,则任务可能具有子任务,并且它们内部的所有故障都聚集在单个对象中,该对象可以在父任务等待时被捕获。 以下是异常聚合的示例:

        var task = Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Parent task");
            var subTask = Task.Factory.StartNew(
                () =>
                {
                    Console.WriteLine("Child");
                    throw new Exception("Exception in the child");
                }, TaskCreationOptions.AttachedToParent);
            throw new Exception("Exception in the parent");
        });
    
        try
        {
            task.Wait();
        }
        catch (AggregateException e)
        {
            Console.WriteLine(e);
        }
    

    catch 块中捕获的异常将包含两个任务的异常,因为子任务是使用AttachedToParent 选项创建的。

  3. 您可以将同步上下文视为执行某些工作单元的抽象。它实际上公开了两个方法:SendPost,它们接收一些委托来执行(同步或异步)作为参数。默认情况下,它会在异步语义(Post)的情况下安排线程池中传递的委托的执行,或者在同步语义(Send)的情况下直接执行它。为什么需要它?抽象提供了提供工作执行单元的其他实现的机会。例如,有些实现在内部使用消息泵来安排特定线程上的所有执行,这对于 Windows 窗体或 WPF 的 UI 任务很有用。或者您可以实现自己的同步上下文,例如为了让一些任务按顺序执行,或者只是组成更复杂的场景。 TaskScheduler 的特定实现称为 SynchronizationContextTaskScheduler,它在 SynchronizationContext 之上运行(即在同步上下文中调度执行),这两个抽象提供了灵活的机制来适应任何执行同步要求。作为应用程序的一个具体示例,async/await 机制在内部使用SynchronizationContext 来安排异步操作的延续。借助各种同步上下文,只要使用正确的SynchronizationContext 实现,它就可以透明地工作,而不管它使用的框架(Win Forms、WPF、ASP.NET、控制台应用程序等)如何。

【讨论】:

  • 非常感谢。但是,当我将(我知道这不是一个好主意)您的 AggregationException 代码示例复制到 VS2017 时,它不起作用。
  • @Marc2001,我刚刚仔细检查并没有注意到代码有问题,但也许我忽略了一些东西,所以请你详细说明一下到底是什么不起作用?
  • @DmytroMukalove,我也不知道。我见过很多涉及这种模式的例子。当我尝试所有这些网站的示例时,它们都不起作用。网站在博客中写道,当任务中发生错误时,它将把它包装在一个聚合异常中。他们总是显示与您的模式相同的示例,但它们不起作用。不知道是bug还是我没有正确下载VS2017但是很烦人
  • @Marc2001,对“不起作用”问题的清晰解释将很有用。是编译时问题还是运行时问题。如果运行时什么是实际结果。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2013-07-07
  • 2013-05-10
  • 2012-03-18
相关资源
最近更新 更多