我一直在线程之间传递文化问题。我已经设法使用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/