C# 在回调完成后执行方法 我有一个C++应用程序,使用C++ DLL。C++ DLL非常简单。我可以调用一个方法,它有一个回调方法。回调方法必须完成,才能处理下一项
问题是,我一次只能处理一个命令,但我希望尽可能快地处理它们 < C++ > DLL的伪/简化代码接口:< /P>C# 在回调完成后执行方法 我有一个C++应用程序,使用C++ DLL。C++ DLL非常简单。我可以调用一个方法,它有一个回调方法。回调方法必须完成,才能处理下一项,c#,asynchronous,callback,C#,Asynchronous,Callback,问题是,我一次只能处理一个命令,但我希望尽可能快地处理它们 < C++ > DLL的伪/简化代码接口:< /P> void AddNumbers(int a, int b, AddNumbersCallback callback); 现在让我们尝试使用它: void DoStuff() { if(MyCollection.HasStuff) AddNumbers(MyCollection.First().a, MyCollection.First.b, Stuff
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();
}
调用
DoStuff()
作为StuffDone
的最后一行与“after”有什么不同?如果在回调完成之前再次调用该函数会发生什么?这似乎违背了“异步”的整个定义,以及C#中回调函数的含义,即它要求您等待。在DoStuff和StuffDone中使用Console.WriteLine(Thread.CurrentThread.ManagedId)。如果你得到不同的数字,那么你就有一个无法可靠解决的问题。如果不这样做,则只在AddNumbers()调用后运行代码。但这是否保证“done.WaitOne();”行在“StuffDone”完成之前不会让执行继续?问题似乎是,在我处理下一个项目之前,“StuffDone”必须从调用堆栈中删除。如果事先不知道两个线程的线程句柄,就无法真正保证这样的事情,因为没有一个DLL值得花钱,它会依赖于你编写代码。我认为DLL可能不是真正的异步的(它只是在完成回调时调用回调),如果有很多条目,回调对DoStuff()的调用将溢出堆栈。EventWaitHandle的内容应该考虑到这种情况,以及当事情真正异步时,您正在等待在StuffDone中执行的任何处理。这对我来说非常有用。“WaitOne”非常容易使用。