6#include <system/object.h>
7#include <system/action.h>
8#include <system/threading/tasks/task.h>
9#include <system/threading/tasks/task_status.h>
10#include <system/threading/tasks/task_scheduler.h>
11#include <system/details/dereference.h>
13namespace System {
namespace Details {
18struct ASPOSECPP_SHARED_CLASS AsyncContext
22 AsyncContext(Threading::Tasks::Task* task) : m_task(task) {}
26 void Step(int32_t s) {stage = s;}
28 ASPOSECPP_SHARED_API
void Return();
30 ASPOSECPP_SHARED_API
void Continue();
39 bool Await(
const T& awaitee, int32_t step)
41 return AwaitImpl(awaitee, step, [](
const auto& awaiter) { awaiter.GetResult(); });
52 template <
typename T,
typename V>
53 bool Await(
const T& awaitee, V& value, int32_t step)
55 return AwaitImpl(awaitee, step, [&value](
const auto& awaiter) { value = awaiter.GetResult(); });
70 template <
typename AwaiteeT,
typename ContinuerT>
71 bool AwaitImpl(
const AwaiteeT& awaitee, int32_t step,
const ContinuerT& continuer)
75 auto awaiter = Dereference(awaitee).GetAwaiter();
76 if (awaiter.get_IsCompleted())
84 auto continuationContext =
85 awaiter.continueOnCapturedContext
89 awaiter.OnCompleted(Action<>([
this, awaiter, continuer, continuationContext]
91 m_continuer = [awaiter, continuer](){continuer(awaiter);};
93 m_task->Activate(continuationContext);
100 Threading::Tasks::Task* m_task;
102 std::function<void()> m_continuer;
107using AsyncFunction = std::function<void(AsyncContext&)>;
113struct ResultAsyncContext : AsyncContext
117 ResultAsyncContext(Threading::Tasks::ResultTask<T>* task) : AsyncContext(task), m_result_task(task) {}
123 void Return(
const T& result)
125 m_result_task->set_Result(result);
127 AsyncContext::Return();
132 Threading::Tasks::ResultTask<T>* m_result_task;
140using ResultAsyncFunction = std::function<void(ResultAsyncContext<T>&)>;
149 auto result = System::MakeObject<Threading::Tasks::ResultTask<T>>();
150 Details::ResultAsyncContext<T> context(result.GetPointer());
151 result->set_Function([fnc, context]()
mutable { fnc(context); });
152 result->RunSynchronously();
static SharedPtr< TaskScheduler > FromCurrentSynchronizationContext()
Creates a TaskScheduler associated with the current thread.
@ Continue
The 'Continue' status code that equals to HTTP status 100.
@ WaitingForChildrenToComplete
Definition: db_command.h:9
TaskPtr MakeAsync(const Details::AsyncFunction &fnc)