我是并行编程,线程,任务等的新手。所以,前几天我在阅读,这本书向我介绍了线程。它没有很好地解释它,所以我对这个概念有些迷惑。我有几个问题:
默认情况下线程是否异步?因为,当我们运行多个线程时,它将运行并且不会停止任何其他线程或任务,从而使它们异步。
聚合异常如何工作?我的意思是像我们如何处理它,它是如何发生的?请举个例子。
什么是同步上下文?我在网上查找并看到了很多定义。有些人试图使用聪明的发音词,这只会引起我的大脑混乱。
我听说所有这些概念都很复杂。并发症驱使我进一步了解它。
答案 0 :(得分:0)
简单地说:
是的,默认情况下它们是异步的,因为内部基于抢占式多任务机制。也就是说,如果您不应用显式同步机制(例如互斥体,临界区,信号量等),则在任何执行点线程都可以被另一个线程“中断”,这会使线程排队进入“执行队列”。当他们达到同步点时。因此,是的,一个线程不会停止其他线程,除非它们遇到相同的同步对象。
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);
}
选项创建的。
您可以将同步上下文视为执行某些工作单元的抽象。它实际上公开了两个方法:AttachedToParent
和Send
,它们接收一些委托作为参数(同步或异步)执行。默认情况下,它在异步语义(Post
)的情况下安排线程池中传递的委托的执行,或者在异步语义(Post
)的情况下直接执行它。为什么需要它?抽象为提供工作执行单元的其他实现提供了机会。例如,有些实现在内部使用消息泵来安排在特定线程上的所有执行,这对于Windows窗体或WPF的UI任务可能很有用。或者,您可以实现自己的同步上下文,例如以便顺序执行某些任务,或者仅构成更复杂的场景。 Send
的特定实现称为TaskScheduler
,它在SynchronizationContextTaskScheduler
之上运行(即,在同步上下文中调度执行),并且这两个抽象提供了适应任何执行同步要求的灵活机制。作为应用程序的特定示例,SynchronizationContext
/ async
机制在内部使用await
来调度异步操作的继续。借助各种同步上下文,无论使用哪种框架(Win Forms,WPF,ASP.NET,Console App等),都可以透明地工作,只需使用适当的SynchronizationContext
实现即可。