У меня есть асинхронный метод в одноэлементном классе, который должен вызывать событие в потоке пользовательского интерфейса, потому что большинство людей, подписанных на это событие, являются элементами управления, но вызывающий метод не является элементом управления. Поскольку вызывающий элемент не всегда является элементом управления, я не могу передать его Invoke дальше обратно в поток пользовательского интерфейса, поэтому вместо этого я использую AsyncOperation / SynchronizationContext, чтобы получить текущий контекст потока перед запуском фонового потока, а затем в фоновом потоке. Я звоню Post, вроде как ...
public void AsyncMethod()
{
AsyncOperation ao = AsyncOperationManager.CreateOperation(null);
// or SynchronizationContext ctx = WindowsFormsSynchronizationContext.Current;
ThreadPool.QueueUserWorkItem(delegate(objact state)
{
//do stuff
ao.Post(delegate(object state2)
{
// fire event
}, null);
}, null);
}
Проблема в том, что AsyncOperation иногда дает мне новый контекст, или WindowsFormsSynchronizationContext имеет значение null. Я нашел кого-то еще, у кого была такая же проблема, и я думаю, что она связана с выпадающими пунктами меню, создающими элементы управления, которые будут происходить в событиях. В любом случае, мой вопрос: если WindowsFormsSynchronizationContext имеет значение null, могу ли я создать новый для вызова Post, и будет ли этот новый контекст контекста пользовательского интерфейса или контекст потока, в котором он был создан?