時間のかかるサービスを提供するライブラリを開発しています。各APIの2つのバージョンが必要です。1つは同期関数呼び出し用で、もう1つは非同期用です。
ライブラリユーザーは、使用するバージョンを決定する必要があります。サービスの結果は、システム操作(同期呼び出し)を継続するために重要な場合があります。続行する必要がないため、同じ操作を別のワーカースレッドで実行する必要がある場合があります(非同期呼び出し)。
このアプローチの問題は何ですか?
より良い方法はありますか?
同じAPIに対して同期/非同期の両方を提供する人気のあるライブラリはありますか(外部イベントまたはスレッドを使用せずに)?
これが私が提供しようとしているものの例です:
enum StuffStatus
{
SUCCEED,
FAILED,
STILL_RUNNING
};
class IServiceCallback
{
public:
void lengthyStuffCallback(StuffStatus status);
};
class MyServiceClass
{
public:
StuffStatus doSomeLengthStuff(IServiceCallback* callback)
{
if( callback == NULL ) // user wants sync. call
{
// do all operations in caller context
return SUCCEED;
}else{
// save the callback, queue the request in a separate worker thread.
// and after the worker thread finishes the job it calls callback->lengthyStuffCallback(SUCCEED) from its context.
return STILL_RUNNING;
}
}
};
編集:「MatthieuM。」として 述べたように、私のサービスでは、継続渡しスタイル(API終了後のコールバック)との非同期が必要です。