Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SetSynchronizationContext的生存期是多少?_C#_Async Await_Synchronizationcontext - Fatal编程技术网

C# SetSynchronizationContext的生存期是多少?

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

我有一个定制的SynchronizationContext,它抽象出一个定制的工作队列系统。我正在尝试编写一个helper函数,它使客户端代码能够轻松地为它编写代码

“我的助手”函数当前看起来像:

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);