时间:2010-05-04 12:31:10

标签: c# asynchronous callback

我有一个使用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。

1 个答案:

答案 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();
}