有关线程的一些问题

时间:2018-08-25 03:48:21

标签: c# multithreading task

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

  1. 默认情况下线程是否异步?因为,当我们运行多个线程时,它将运行并且不会停止任何其他线程或任务,从而使它们异步。

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

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

我听说所有这些概念都很复杂。并发症驱使我进一步了解它。

1 个答案:

答案 0 :(得分:0)

简单地说:

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

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

    function kurse_role_caps() {
        // gets the simple_role role object
        $role = get_role('administrator');
    
        // add a new capability
        $capabilities = array( 'manage_location', 'edit_location', 'delete_location', 'assign_location', 'manage_typ', 'edit_typ', 'delete_typ', 'assign_typ' );
        foreach( $capabilities as $cap ) {
            $role->add_cap( $cap );
        }
    }
    
    // add simple_role capabilities, priority must be after the initial role definition
    add_action('init', 'kurse_role_caps', 11);
    

    在catch块中捕获的异常将包含两个任务的异常,因为子任务是使用 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); } 选项创建的。

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