У меня есть очень большая функция в моей C ++ DLL, которая выполняет много задач.
мы вызываем его из оболочки c #, и для завершения функции c ++ требуется около 20 секунд.
Я хочу изменить способ, которым мы его управляем.
моя идея
1. вызвать функцию c ++ асинхронно и
2. каждый раз, когда задача с функцией C ++ завершается, я хочу отправить сообщение «task1 complete» в функцию C # и отобразить его пользователю, чтобы они знали, что происходит в фоновом режиме.
какие-нибудь идеи, как выполнить это? Я посмотрел несколько примеров, но чувствовал себя смущенным. Я хочу знать, сделал ли кто-нибудь это. ищу несколько указателей.
EX: код C ++
int CppLibrary::ExecuteWorkflow( param1,param2, param3,param4,param5)
{
task1;
task2;
task3;
task4;
task5;
}
calling the C++ function from C# wrapper:
[DllImport(_dllLocation)]
public static extern int ExecuteWorkflow( param1,param2, param3,param4,param5);
Вы можете использовать делегаты в C # для вызова оболочки C ++, а затем использовать «invoke» или «beginInvoke» в зависимости от вашей ситуации.
Вот класс-оболочка для функции P / Invoke C ++. Надежда может помочь вам.
class CSUnmangedTestClass : IDisposable
{
#region P/Invokes
[DllImport(@"E:\VS2012Tests\test\Debug\DllImport.dll", EntryPoint="#1")]
private static extern IntPtr Foo_Create();
[DllImport(@"E:\VS2012Tests\test\Debug\DllImport.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int Foo_Bar(IntPtr pFoo);
[DllImport(@"E:\VS2012Tests\test\Debug\DllImport.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void Foo_Delete(IntPtr pFoo);
#endregion
#region Members
// variable to hold the C++ class's this pointer
private IntPtr m_pNativeObject;
#endregion
public CSUnmangedTestClass()
{
this.m_pNativeObject = Foo_Create();
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool bDisposing)
{
if (this.m_pNativeObject != IntPtr.Zero)
{
Foo_Delete(m_pNativeObject);
this.m_pNativeObject = IntPtr.Zero;
}
if (bDisposing)
{
// No need to call the finalizer since we've now cleaned up the unmanged memory
GC.SuppressFinalize(this);
}
}
~CSUnmangedTestClass()
{
Dispose(false);
}
#region Wrapper methods
public int Bar()
{
return Foo_Bar(m_pNativeObject);
}
#endregion
}