C# 在回调完成后执行方法 我有一个C++应用程序,使用C++ DLL。C++ DLL非常简单。我可以调用一个方法,它有一个回调方法。回调方法必须完成,才能处理下一项

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

问题是,我一次只能处理一个命令,但我希望尽可能快地处理它们

< C++ > DLL的伪/简化代码接口:< /P>
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”非常容易使用。