다음을 통해 공유


일반 비동기 작업 래퍼

이 항목에서는 일반 비동기 작업 래퍼를 작성하는 방법에 대한 예제를 제공합니다. 비동기 블록을 수동으로 설정하고 각 작업에 대해 XAsyncRun을 호출하는 대신 RunTask 래퍼를 만들어 이 프로세스를 간호화합니다. 이 래퍼를 사용하여 작업 큐, 작업 및 선택적 완료 콜백을 지정할 수 있습니다.

void RunTask(XTaskQueueHandle taskQueue,
    std::function<void()> workCallback,
    std::function<void()> completionCallback)
{
    struct RunTaskContext
    {
        std::function<void()> workCallback;
        std::function<void()> completionCallback;
    };

    RunTaskContext* context = new RunTaskContext();
    context->workCallback = workCallback;
    context->completionCallback = completionCallback;
    XAsyncBlock* async = new XAsyncBlock{};
    async->queue = taskQueue;
    async->context = context;
    async->callback = [](XAsyncBlock* async)
    {
        RunTaskContext* context = static_cast<RunTaskContext*>(async->context);
        context->completionCallback();
        delete context;
        delete async;
    };

    // Callback passed to XAsyncRun is the work callback
    XAsyncRun(async,
        [](XAsyncBlock* async)->HRESULT
        {
            RunTaskContext* context = static_cast<RunTaskContext*>(async->context);
            context->workCallback();
            return S_OK;
        });
}

이전 샘플은 비동기 블록 한 개와 콜백 두 개(작업 한 개, 완료 한 개)를 가져오는 함수를 구현합니다. 완료 콜백은 선택 사항이므로 작업 콜백만 가져오는 버전을 작성할 수 있습니다.

이는 표준 패턴을 사용하여 비동기 블록을 설정하고, 컨텍스트 데이터를 설정하며, XAsyncRun을 호출합니다. RunTask은(는) 간단한 독립형 작업 함수를 만들어 상용구 코드를 캡슐화합니다. 간단한 데이터 캡처는 std::function을(를) 사용하여 컨텍스트 매개 변수 없이 콜백으로 전달됩니다.

RunTask(taskQueue,
    []()
    {
        // Work Callback
    },
    []()
    {
        // Completion Callback
    });

참고 항목

비동기 프로그래밍 개요
XAsync
XTaskQueue