Вам не нужно запускать асинхронные методы, используя Task.Run()
или любые другие специальные средства, просто вызовите их. И в вашем случае это именно то, что вызывает проблему.
Данная функция выглядит следующим образом:
Action f = async () =>
{
while (true)
{
// modify the observable collection here
await Task.Delay(500);
}
};
Вызывая это так из некоторого метода, запущенного в потоке пользовательского интерфейса, например, обработчик события:
f();
работает точно так, как должно. Он выполняет первую итерацию цикла и затем возвращается. Следующая итерация выполняется через 500 мс (или более, если поток пользовательского интерфейса занят) в потоке пользовательского интерфейса.
С другой стороны, если вы называете это так:
Task.Run(addNames);
это не работает правильно. Причина этого заключается в том, что async
методы пытаются продолжить в том же контексте, в котором они были запущены (если вы явно не укажете иное). Первая версия была запущена в потоке пользовательского интерфейса, поэтому она продолжалась в потоке пользовательского интерфейса. Вторая версия началась в потоке ThreadPool (спасибо Task.Run()
) и продолжалась там же. Вот почему это вызвало вашу ошибку.
Все это делается с помощью SynchronizationContext
, если таковой имеется.