6#include <system/object_ext.h>
7#include <system/action.h>
8#include <system/threading/tasks/result_task.h>
9#include <system/threading/tasks/task_status.h>
10#include <system/details/dereference.h>
12namespace System {
namespace Details {
17struct ASPOSECPP_SHARED_CLASS AsyncContextBase
20 AsyncContextBase() : stage(0), m_executing(false) {}
22 AsyncContextBase(
const AsyncContextBase& other) : AsyncContextBase() {}
25 ASPOSECPP_SHARED_API
void Continue();
34 bool Await(
const T& awaitee, int32_t step)
36 return AwaitImpl(awaitee, step, [](
const auto& awaiter) { awaiter.GetResult(); });
47 template <
typename T,
typename V>
48 bool Await(
const T& awaitee, V& value, int32_t step)
50 return AwaitImpl(awaitee, step, [&value](
const auto& awaiter) { value = ExplicitCast<V>(awaiter.GetResult()); });
54 ASPOSECPP_SHARED_API
void operator()();
61 using Continuer = std::function<void()>;
64 virtual Threading::Tasks::Task* get_Task()
const = 0;
75 template <
typename AwaiteeT,
typename ContinuerT>
76 bool AwaitImpl(
const AwaiteeT& awaitee, int32_t stage,
const ContinuerT& continuer)
79 auto awaiter = Dereference(awaitee).GetAwaiter();
82 if (awaiter.get_IsCompleted())
89 Suspend([awaiter, continuer]() { continuer(awaiter); }, stage);
92 auto continuationContext = GetResumeScheduler(awaiter.continueOnCapturedContext);
95 get_Task()->SharedRefAdded();
98 awaiter.OnCompleted(Action<>([
this, continuationContext]
101 Resume(continuationContext);
104 get_Task()->SharedRefRemovedSafe();
110 ASPOSECPP_SHARED_API
void Suspend(Continuer&& continuer, int32_t stage);
112 ASPOSECPP_SHARED_API SharedPtr<Threading::Tasks::TaskScheduler> GetResumeScheduler(
bool continueOnCapturedContext)
const;
114 ASPOSECPP_SHARED_API
void Resume(
const SharedPtr<Threading::Tasks::TaskScheduler>& context);
117 Continuer m_continuer;
121 SharedPtr<Threading::Tasks::TaskScheduler> m_activator;
123 std::mutex m_state_mutex;
128using AsyncFunction = std::function<void(
struct AsyncContext&)>;
132struct AsyncContext : AsyncContextBase
136 AsyncContext(Threading::Tasks::Task* task,
const AsyncFunction& fnc) : m_task(task), m_function(fnc)
140 ASPOSECPP_SHARED_API
void Return();
144 Threading::Tasks::Task* get_Task()
const override {
return m_task;}
146 void Execute()
override {m_function(*
this);}
149 Threading::Tasks::Task* m_task;
151 AsyncFunction m_function;
155struct ResultAsyncContext;
162using ResultAsyncFunction = std::function<void(ResultAsyncContext<T>&)>;
168struct ResultAsyncContext : AsyncContextBase
172 ResultAsyncContext(Threading::Tasks::ResultTask<T>* task,
const ResultAsyncFunction<T>& fnc) : m_result_task(task), m_function(fnc)
179 void Return(
const T& result)
181 m_result_task->set_Result(result);
187 Threading::Tasks::Task* get_Task()
const override {
return m_result_task;}
189 void Execute()
override {m_function(*
this);}
192 Threading::Tasks::ResultTask<T>* m_result_task;
194 ResultAsyncFunction<T> m_function;
204 auto result = System::MakeObject<Threading::Tasks::ResultTask<T>>();
205 result->
set_Function(Details::ResultAsyncContext<T>(result.GetPointer(), fnc));
206 result->RunSynchronously();
void set_Function(const FunctionT &fnc)
Sets the internal function to execute.
Definition: task.h:131
@ Suspend
Suspension of a logical operation.
@ Resume
Resumption of a logical operation.
@ Continue
The 'Continue' status code that equals to HTTP status 100.
Definition: db_command.h:9
TaskPtr MakeAsync(const Details::AsyncFunction &fnc)