首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SynchronizationContext在Task.Yield()之后丢失

SynchronizationContext在Task.Yield()之后丢失
EN

Stack Overflow用户
提问于 2015-07-19 23:45:32
回答 1查看 482关注 0票数 2

我一直有一些问题,在线程之间传递文化。我已经设法让它在某种程度上使用了同步上下文,但是在我的代码的一部分中,我使用了Task.Yield()。在这段代码之后,我的上下文丢失了,这意味着以后的所有后续等待/生成都不要使用我的自定义SynchronizationContext。

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

同步上下文类:

代码语言:javascript
复制
public class TestSynchronizationContext : SynchronizationContext
{
}

单元测试:

代码语言:javascript
复制
[Test]
public async Task TestHere()
{
    TestSynchronizationContext context = new TestSynchronizationContext();
    SynchronizationContext.SetSynchronizationContext(context);
    var something1 = SynchronizationContext.Current;
    await Task.Yield();
    var something = SynchronizationContext.Current;
}

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

代码语言:javascript
复制
[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());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-20 01:49:50

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31507127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档