我一直在线程之间传递文化问题。我已经设法使用Synchronization上下文使它有所工作,但是在我的代码的一部分中,我使用了Task.Yield()。在这段代码之后,我的上下文丢失了,这意味着此刻之后的所有后续等待/收益都不要使用我的自定义SynchronizationContext。

我将其简化为一个非常简单的测试,可以看到在Task.Yield之后,我们的SynchronizationContext丢失了。

同步上下文类:

public class TestSynchronizationContext : SynchronizationContext
{
}


单元测试 :

[Test]
public async Task TestHere()
{
    TestSynchronizationContext context = new TestSynchronizationContext();
    SynchronizationContext.SetSynchronizationContext(context);
    var something1 = SynchronizationContext.Current;
    await Task.Yield();
    var something = SynchronizationContext.Current;
}


编辑:如果我使用一个新的任务,如果可以传递正确的TaskScheduler(尽管...这是调度程序,而不是同步上下文),将保留上下文。如以下内容:

[Test]
public async Task TestHere()
{
    TestSynchronizationContext context = new TestSynchronizationContext();
    SynchronizationContext.SetSynchronizationContext(context);
    CultureInfo taskCulture = null;
        Task.Factory.StartNew(
            () => { taskContext = SynchronizationContext.Current; },
            CancellationToken.None,
            TaskCreationOptions.None,
            TaskScheduler.FromCurrentSynchronizationContext()
            ).Wait();
    Assert.AreEqual(context.GetType(), taskContext.GetType());
}

最佳答案

您的SychronizationContext必须将自己设置为Current。如果您的SynchronizationContext用于专用线程,则只需在主循环中设置一次电流即可。如果它使用线程池线程来执行(如示例代码中所示),则应在借用其中一个线程时进行设置(当然,在将线程返回线程池之前将其清除)。

关于c# - Task.Yield()之后失去SynchronizationContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31507127/

10-13 08:30