Выполните метод ПОСЛЕ ТОГО, КАК обратный вызов завершится

У меня есть приложение C# с помощью DLL C++. DLL C++ чрезвычайно прост. Я могу назвать один метод, и он имеет метод обратного вызова. Метод обратного вызова должен закончиться, прежде чем я смогу обработать следующий объект.

Проблема, я могу только обработать одну команду за один раз, но я хочу обработать их максимально быстро.

Фальсифицируйте/упрощайте интерфейс кода для C++ DLL:

void AddNumbers(int a, int b, AddNumbersCallback callback);

Теперь позволяет попытке использовать его:

void DoStuff()
{
     if(MyCollection.HasStuff)
          AddNumbers(MyCollection.First().a, MyCollection.First.b, StuffDone);
}

void StuffDone(int result)
{
    //I wish I could process the next item here, but the callback isn't done!
    //DoStuff();
}

Корень проблемы - то, что я хочу выполнить код после того, как обратный вызов сделан.

Мое временное решение состояло в том, чтобы поставить объект в очередь в пуле потоков и ожидать 100 мс. Как правило, это даст время метода для "заканчиваний".

И "нет", я не могу изменить DLL.

1
задан Jason Young 4 May 2010 в 12:31
поделиться

1 ответ

Если функция действительно асинхронна, то не должно иметь значения, сколько раз вы ее вызываете или сколько времени вы ждете между вызовами. (Читай: ваша DLL сломана.) В таком случае, если вам действительно нужна синхронизация, вы, вероятно, захотите использовать EventWaitHandle в цикле.

using System.Threading;

EventWaitHandle done = new EventWaitHandle(false, EventResetMode.AutoReset);

void DoStuff()
{
    while (MyCollection.HasStuff)
    {
        // note: something smelled fishy here.
        // i assume your collection removes the first entry when you call First
        var first = MyCollection.First();
        AddNumbers(first.a, first.b, StuffDone);
        done.WaitOne();
    }
}

void StuffDone(int result)
{
    done.Set();
}
2
ответ дан 3 September 2019 в 00:51
поделиться
Другие вопросы по тегам:

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