C++ クラス内にいくつかのメンバー関数があり、それらを dll としてパッケージ化し、C# アプリケーションで使用しようとしました。
スレッドを使用して単純に実行し、それらが終了するまで呼び出し元のスレッドをブロックしないようにそれらをデタッチすることで、2 つの非同期関数を作成しようとしました。C++ ベースのアプリケーションでは、スレッドを使用してこの方法で関数を呼び出すたびに機能しますが、C# から非同期関数の 1 つを呼び出そうとすると、アプリがクラッシュまたはハングします!!
これらは私のいわゆる非同期関数です!:
void xGramManipulator::CreateMonoGramAsync()
{
thread t(&xGramManipulator::ReadMonoGram, this);
t.detach();
}
void xGramManipulator::CreateBiGramAsync()
{
thread t = thread(&xGramManipulator::ReadBiGram, this);
t.detach();
}
そして、これは dll に存在する c のラッパー関数です:
//header
CDLL_API void CreateMonoGramAsync(void);
//cpp
CDLL_API void CreateMonoGramAsync(void)
{
xG.CreateMonoGramAsync();
}
これは、その関数を呼び出す C# アプリケーションです。
private void btnTest_Click(object sender, EventArgs e)
{
try
{
CreateBiGramAsync();
CreateMonoGramAsync();
}
catch (Exception)
{
}
}
クラスに真に非同期で非ブロッキングのメンバー関数を含めるにはどうすればよいですか? ここで何が欠けていますか?