我有一个使用C ++ DLL的C#应用程序。 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();
}
问题的根源是我想在回调完成之后执行代码。
我的临时解决方案是在线程池中排队项目,并等待100ms。通常,这将使方法有时间“完成”。
而且“不”,我无法更改DLL。
答案 0 :(得分:2)
如果该功能是真正异步的,那么调用它的次数或者在两次通话之间等待的时间并不重要。 (阅读:你的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();
}