У меня возникли проблемы, связанные с культурой между потоками. Мне удалось немного работать, используя контекст синхронизации, но в одной части моего кода я использую Task.Yield(). После этого фрагмента кода мой контекст потерян, что означает, что все последующие ожидания/выходы после этой точки не используют мой собственный SynchronizationContext.SynchronizationContext потерял после Task.Yield()
Я сварил его до очень простого теста, и я вижу, что после нашей задачи. Наш ресурс SynchronizationContext потерян.
синхронизации Контекст Класс:
public class TestSynchronizationContext : SynchronizationContext
{
}
Unit Test:
[Test]
public async Task TestHere()
{
TestSynchronizationContext context = new TestSynchronizationContext();
SynchronizationContext.SetSynchronizationContext(context);
var something1 = SynchronizationContext.Current;
await Task.Yield();
var something = SynchronizationContext.Current;
}
EDIT: Если я использую новую задачу, контекст сохраняется, если я могу передать в правильном 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());
}
В вашем случае 'TestSynchronizationContext.Post' действительно вызывается логикой' YieldAwaitable', но [все это делается по умолчанию] (http://referencesource.microsoft.com/#mscorlib/system/threading/synchronizationcontext.cs , 16705ba05372139e, ссылки) вызывает 'ThreadPool.QueueUserWorkItem' для обратного вызова продолжения. Поэтому после «ожидания» вы попадаете в случайный поток ThreadPool без какого-либо контекста синхронизации и без вашего объекта «Culture». – Noseratio
Измените тестовый пример: вместо 'Task.Factory.StartNew (...) .Wait();', поместите 'var task = Task.Factory.StartNew (...); Thread.Sleep (1000); task.Wait(); '. – PetSerAl