Выполнить метод ПОСЛЕ завершения обратного вызова - PullRequest
1 голос
/ 04 мая 2010

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

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

Интерфейс поддельного / упрощенного кода для 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();
}

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

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

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

1 Ответ

2 голосов
/ 04 мая 2010

Если функция действительно асинхронная, то не должно иметь значения, сколько раз вы ее вызываете или сколько времени вы ожидаете между вызовами. (Читайте: ваша 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...