我一直有一些问题,在线程之间传递文化。我已经设法让它在某种程度上使用了同步上下文,但是在我的代码的一部分中,我使用了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());
}发布于 2015-07-20 01:49:50
您的SychronizationContext必须将自己设置为Current。如果您的SynchronizationContext用于专用线程,则只需在主循环中设置一次current;如果它使用线程池线程执行(如示例代码中所示),则应该在借用其中一个线程时设置它(当然,在将线程返回到线程池之前清除它)。
https://stackoverflow.com/questions/31507127
复制相似问题