【发布时间】:2010-05-04 12:31:10
【问题描述】:
我有一个使用 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();
}
问题的根源是我想在回调完成之后执行代码。
我的临时解决方案是在线程池中排队一个项目,然后等待 100 毫秒。通常,这会给方法“完成”的时间。
“不”,我无法更改 DLL。
【问题讨论】:
-
将
DoStuff()作为StuffDone的最后一行而不是“之后”有什么不同? -
如果在回调完成之前再次调用该函数会发生什么?它似乎违背了“异步”的整个定义,以及整个 C# 中回调函数的含义,它需要你等待。
-
在 DoStuff 和 StuffDone 中使用 Console.WriteLine(Thread.CurrentThread.ManagedId)。如果你得到不同的数字,那么你就有一个无法可靠解决的问题。如果您不这样做,那么只需在 AddNumbers() 调用之后运行代码。
标签: c# asynchronous callback