(ポインタとミューテックスの名前を返すDLLから「セットアップ」機能を提供することにより、消費するアプリケーションのためにそれを緩和することができ)クライアント。
// your library
class Foo {
public event EventHandler ComputeCompleted = (sender, e) => { };
public void Compute() {
// kick off work on a background thread
// possibly using the BackgroundWorker object
var bw = new BackgroundWorker();
bw.RunWorkerCompleted += RunWorkerCompleted;
bw.RunWorkerAsync();
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
ComputeCompleted(this, new object());
}
}
// calling code
Foo foo = new Foo();
foo.ComputeCompleted += Completed;
foo.Compute();
private void Completed(object Sender, EventArgs e) {
// process the result here
}
要旨はすぐに返すライブラリ内のメソッドをキックオフということで、その後、処理が完了したイベント/デリゲート経由して、発信者に通知します。その後、必要に応じて実行をUIスレッドに呼び出すことができます。
明らかに、エラー処理はサンプルコードに含まれていません。
本当にあなたが何をしているかによって異なる...あなたは、次の入力チャンクが必要なときにDLLによって呼び出される関数へのポインタを交換することもできます...共有メモリとグローバルmutexを使ってデータを交換できますあなたは本当にもっと多くの詳細を与える必要があります。 – Yahia
ここにはさまざまなオプションがあります - それは、あなたが得た出力の種類と入力がどのようなものかによって部分的に異なります。私が「非同期」と聞くと、私はワンショットの非同期呼び出しを考える傾向があります。「ここにいくつかの入力があり、準備ができたら出力を出す」ということですが、ストリーミング・ソリューションのほうが望ましいかもしれません。より多くの文脈が役に立つでしょう。 –
1つのオプションは、出力データのチャンクを処理するためにコールできるコールバックパラメータを関数に持たせることです。しかし、APIの中で最も便利ではないかもしれません。より自然な方法では、ある種のイテレータオブジェクトを返すことになりますが、その入力がどこから来るかによって、ライブラリをより複雑にすることができます。 – millimoose