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