我有一个使用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。
将'DoStuff()'作为'StuffDone'的最后一行而不是“after”调用有什么不同? – 2010-05-04 12:38:42
如果在回调完成之前再次调用该函数会发生什么?它似乎违背了“异步”的整个定义,以及C#中的回调函数作为一个整体的含义,它需要你等待。 – cHao 2010-05-04 12:42:16
在DoStuff和StuffDone都使用Console.WriteLine(Thread.CurrentThread.ManagedId)。如果你得到不同的数字,那么你有一个问题,你不能可靠地解决。如果你不这么做,那么只需在AddNumbers()调用之后运行代码即可。 – 2010-05-04 13:28:22