я работаю с некоторым кодом, который имеет подход я никогда не имел дело с прежде, и я надеюсь кто-то может быть в состоянии обеспечить искру знаний:Секвенциально методы вызова асинхронной в цикле
Эффективно класс настроен так:
void Loop()
{
for (int i = 0; i < 100; i++)
{
//need to block calls to this until UpdateComplete is hit
Update(i);
}
}
void Update(int i)
{
//asynchronous - returns immediately
}
void UpdateComplete()//called from another thread
{
//unblock further calls to Update();
}
большой нюанс в том, что это не представляется возможным назвать Update()
до того UpdateComplete()
имеет «вернулся» или был calledback.
Игнорирование любых побочных эффектов UI, есть ли четкое решение этой проблемы?
Я в настоящее время есть две стратегии - один Hacky и один я чувствую себя слишком сложно:
1 - Hacky: Установить глобальный класс булево IsBlocked
, что Update()
наборы для true
и UpdateComplete()
наборы к ложным, и внутри моей петли (в Loop()
), просто введите while (IsBlocked){}
.
2 - Сложный: полностью избавиться от петли. Звоните Update(0);
изнутри Loop()
вместо этого и получите UpdateComplete()
позвоните по телефону Update(1);
, Update(2);
и так далее.
Я думаю, я надеюсь, что-то вроде Thread.Pause
, которые затем могут быть удаленно «возобновился» другим потоком (отдельный один, который вызывает UpdateComplete()
Любые идеи оценили!
Я хотел бы использовать 'асинхронных/await' – Eser
Поместите код, где она принадлежит. Добавьте еще один аргумент в Update(), bool с именем «executeAferronously». –
Оба способа, которые вы описываете, не имеют преимуществ при нарезке резьбы. Они эффективно работают на одном потоке во все времена, они просто переходят из одного потока в другой. Так что это только усложняет ситуацию. –