C# SetSynchronizationContext的生存期是多少?
我有一个定制的SynchronizationContext,它抽象出一个定制的工作队列系统。我正在尝试编写一个helper函数,它使客户端代码能够轻松地为它编写代码 “我的助手”函数当前看起来像:C# SetSynchronizationContext的生存期是多少?,c#,async-await,synchronizationcontext,C#,Async Await,Synchronizationcontext,我有一个定制的SynchronizationContext,它抽象出一个定制的工作队列系统。我正在尝试编写一个helper函数,它使客户端代码能够轻松地为它编写代码 “我的助手”函数当前看起来像: void async Task QueueTaskWithCustomContext(Func<Task> task) { var oldContext = SynchronizationContext.Current; try { SynchronizationConte
void async Task QueueTaskWithCustomContext(Func<Task> task) {
var oldContext = SynchronizationContext.Current;
try {
SynchronizationContext.SetCurrent(new CustomSynchronizationContext());
// Yielding prevents any inline synchronous work from being done outside the work queue.
await Task.Yield();
await task();
} finally {
SynchronizationContext.SetCurrent(oldContext);
}
}
我不知道这是否符合犹太教,但它似乎适用于我抛出的测试用例。不过,对于如何设置同步上下文以及它如何与异步代码交互,我有点紧张。具体来说,是否存在自定义同步上下文可能会从helper函数中“泄漏”出来并为其他任务设置的情况?我在想如果不立即等待helper函数。经过一些快速的实验后,我没能做到这一点,但我还是很紧张
或者,我设置try/finally块的方式是否保证即使在第一次等待之后也能设置同步上下文?再一次,我无法通过一些快速的实验来实现,但我仍然对此感到紧张
我想我并不真正理解设置SynchronizationContext的生命周期。它是永久设置,还是直到未设置,还是仅针对当前函数或
具体来说,是否存在自定义同步上下文可能会从helper函数中“泄漏”出来并为其他任务设置的情况
绝对:
QueueTaskWithCustomContext(async() => await Task.Delay(1000));
await Task.Delay(10);
外部较小的延迟将在自定义计划程序上运行,而不是在默认计划程序上运行
我衷心建议不要使用这种退化的代码,因为任务调度器突然发生了意外的变化,这会让用户大吃一惊,这只会带来麻烦
编辑:因为我没有明确回答您的主要问题,“当前”任务调度器的生命周期就是线程的生命周期。它存储在TLS中,所以只要你的线程存在,它就会存在。我不明白你为什么要提到调度程序?当你指定一个新的SynchronizationContext时它会改变吗?调度程序,同步上下文,它们是一样的。同步上下文定义用于将任务排入队列的默认计划程序。
QueueTaskWithCustomContext(async() => await Task.Delay(1000));
await Task.Delay(10);