Обходное решение для WaitHandle. Предел дескриптора WaitAll 64?

Теперь у нас есть предложение динамического импорта с ECMA. Это находится на этапе 2. Это также доступно как babel-preset .

Ниже приведен способ сделать условный рендеринг в соответствии с вашим случаем.

if (foo === bar) {
    import('./Baz')
    .then((Baz) => {
       console.log(Baz.Baz);
    });
}

Это в основном возвращает обещание. Ожидается, что ожидается, что модуль обещания получит модуль. В предложении также есть такие вещи, как множественный динамический импорт, импорт по умолчанию, импорт js-файла и т. Д. Здесь вы можете найти более подробную информацию о динамических импортах здесь .

49
задан James 23 April 2010 в 13:01
поделиться

3 ответа

Создайте переменную, которая отслеживает количество запущенных задач:

int numberOfTasks = 100;

Создайте сигнал:

ManualResetEvent signal = new ManualResetEvent(false);

Уменьшайте количество задач, когда задача выполняется Завершено:

if (Interlocked.Decrement(ref numberOftasks) == 0)
{

Если не осталось задач, установите сигнал:

    signal.Set();
}

Тем временем, в другом месте, дождитесь установки сигнала:

signal.WaitOne();
46
ответ дан 7 November 2019 в 11:34
поделиться

Вот другое решение. Вот "события", список 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;
           }
   }

0
ответ дан 7 November 2019 в 11:34
поделиться

Добавив к ответу 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();
    }
}
6
ответ дан 7 November 2019 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: