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