Теперь у нас есть предложение динамического импорта с ECMA. Это находится на этапе 2. Это также доступно как babel-preset .
Ниже приведен способ сделать условный рендеринг в соответствии с вашим случаем.
if (foo === bar) {
import('./Baz')
.then((Baz) => {
console.log(Baz.Baz);
});
}
Это в основном возвращает обещание. Ожидается, что ожидается, что модуль обещания получит модуль. В предложении также есть такие вещи, как множественный динамический импорт, импорт по умолчанию, импорт js-файла и т. Д. Здесь вы можете найти более подробную информацию о динамических импортах здесь .
Создайте переменную, которая отслеживает количество запущенных задач:
int numberOfTasks = 100;
Создайте сигнал:
ManualResetEvent signal = new ManualResetEvent(false);
Уменьшайте количество задач, когда задача выполняется Завершено:
if (Interlocked.Decrement(ref numberOftasks) == 0)
{
Если не осталось задач, установите сигнал:
signal.Set();
}
Тем временем, в другом месте, дождитесь установки сигнала:
signal.WaitOne();
Вот другое решение. Вот "события", список ManualResetEvent. Размер списка может быть больше, чем 64 (MAX_EVENTS_NO).
int len = events.Count;
if (len <= MAX_EVENTS_NO)
{
WaitHandle.WaitAll(events.ToArray());
} else {
int start = 0;
int num = MAX_EVENTS_NO;
while (true)
{
if(start + num > len)
{
num = len - start;
}
List<ManualResetEvent> sublist = events.GetRange(start, num);
WaitHandle.WaitAll(sublist.ToArray());
start += num;
if (start >= len)
break;
}
}
Добавив к ответу dtb, вы можете обернуть это в красивый простой класс.
public class Countdown : IDisposable
{
private readonly ManualResetEvent done;
private readonly int total;
private long current;
public Countdown(int total)
{
this.total = total;
current = total;
done = new ManualResetEvent(false);
}
public void Signal()
{
if (Interlocked.Decrement(ref current) == 0)
{
done.Set();
}
}
public void Wait()
{
done.WaitOne();
}
public void Dispose()
{
((IDisposable)done).Dispose();
}
}