CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
task_utils.h
1
3
4#pragma once
5
6#include <functional>
7#include <system/object.h>
8#include <system/collections/ienumerable.h>
9#include <system/linq/enumerable.h>
10#include <system/threading/tasks/task.h>
11#include <system/threading/tasks/result_task.h>
12#include <system/threading/tasks/async.h>
13#include <system/array.h>
14
15#undef Yield
16
17namespace System {
18
19namespace Runtime { namespace CompilerServices {
20
24class ASPOSECPP_SHARED_CLASS YieldAwaitable
25{
26public:
29 class ASPOSECPP_SHARED_CLASS YieldAwaiter
30 {
31 public:
34 bool get_IsCompleted() const {return false;}
35
38 ASPOSECPP_SHARED_API void OnCompleted(const Action<>& continuation);
39
41 void GetResult() const {}
42
44 static constexpr bool continueOnCapturedContext = false;
45 };
46
50 {
51 return YieldAwaiter();
52 }
53};
54
55}} // namespace Runtime::CompilerServices
56
57namespace Threading {
58
59class CancellationToken;
60
61namespace Tasks {
62
67ASPOSECPP_SHARED_API TaskPtr Delay(int32_t millisecondsDelay);
68
74ASPOSECPP_SHARED_API TaskPtr Delay(int32_t millisecondsDelay, const CancellationToken& cancellationToken);
75
79ASPOSECPP_SHARED_API TaskPtr FromCanceled(const CancellationToken& cancellationToken);
80
84ASPOSECPP_SHARED_API TaskPtr FromException(const Exception& exception);
85
90template<typename TResult>
92{
93 return MakeAsync<TResult>([=](System::Details::ResultAsyncContext<TResult>& __context) { exception.Throw(); });
94}
95
100template <typename TResult>
102{
103 return MakeObject<ResultTask<TResult>>(result);
104}
105
109ASPOSECPP_SHARED_API TaskPtr Run(const Action<>& action);
110
115ASPOSECPP_SHARED_API TaskPtr Run(const Action<>& action, const CancellationToken& cancellationToken);
116
120ASPOSECPP_SHARED_API TaskPtr Run(const Func<TaskPtr>& function);
121
126template <typename TResult>
128{
129 auto result = MakeObject<ResultTask<TResult>>(function);
130 result->Start();
131 return result;
132}
133
138ASPOSECPP_SHARED_API void WaitAll(const ArrayPtr<TaskPtr>& tasks, const CancellationToken& cancellationToken);
139
142ASPOSECPP_SHARED_API void WaitAll(const ArrayPtr<TaskPtr>& tasks);
143
149ASPOSECPP_SHARED_API int32_t WaitAny(const ArrayPtr<TaskPtr>& tasks, const CancellationToken& cancellationToken);
150
154ASPOSECPP_SHARED_API int32_t WaitAny(const ArrayPtr<TaskPtr>& tasks);
155
159ASPOSECPP_SHARED_API TaskPtr WhenAll(const ArrayPtr<TaskPtr>& tasks);
160
165
170template <typename TResult>
172{
173 return WhenAll(tasks->LINQ_ToArray());
174}
175
180template <typename TResult>
182{
183 auto size = tasks->get_Length();
184 if (size == 0)
185 {
186 return FromResult(MakeArray<TResult>(0));
187 }
188 else if (size == 1)
189 {
190 return tasks[0]->ContinueWith(Func<TaskPtr, ArrayPtr<TResult>>([task = tasks[0]](const TaskPtr&) mutable
191 {
192 auto result = task->get_Result();
193 task = nullptr;
194 return MakeArray<TResult>({result});
195 }));
196 }
197 else return WhenAll(tasks->template LINQ_Cast<TaskPtr>())->ContinueWith(Func<TaskPtr, ArrayPtr<TResult>>([tasks_copy = tasks, size](const TaskPtr&) mutable
198 {
199 auto result = MakeArray<TResult>(size);
200 for (auto i = 0; i < size; ++i)
201 {
202 result[i] = tasks_copy[i]->get_Result();
203 }
204 tasks_copy = nullptr;
205 return result;
206 }));
207}
208
213
217ASPOSECPP_SHARED_API RTaskPtr<TaskPtr> WhenAny(const ArrayPtr<TaskPtr>& tasks);
218
223template <typename TResult>
225{
226 return WhenAny(tasks->template LINQ_Cast<TaskPtr>())->ContinueWith(Func<RTaskPtr<TaskPtr>, RTaskPtr<TResult>>([](const RTaskPtr<TaskPtr>& task)
227 {
228 return ExplicitCast<ResultTask<TResult>>(task->get_Result());
229 }));
230}
231
236template <typename TResult>
238{
239 return WhenAny(tasks->LINQ_ToArray());
240}
241
247
248}}} // namespace System::Threading::Tasks
Interface of object providing enumerator on contained elements.
Definition: ienumerable.h:25
Template that represents wrapper of exceptions that are derived from Exception class.
Definition: exception.h:113
Function delegate. This type should be allocated on stack and passed to functions by value or by refe...
Definition: func.h:82
The awaiter type for YieldAwaitable.
Definition: task_utils.h:30
void OnCompleted(const Action<> &continuation)
Schedules the continuation action for when the yield operation completes.
bool get_IsCompleted() const
Gets whether the yield operation has completed.
Definition: task_utils.h:34
void GetResult() const
Ends the await operation.
Definition: task_utils.h:41
An awaitable type that is returned from TaskUtils::Yield().
Definition: task_utils.h:25
YieldAwaiter GetAwaiter() const
Gets the awaiter for this awaitable.
Definition: task_utils.h:49
Propagates notification that operations should be canceled. This class provides a mechanism for coope...
Definition: cancellation_token.h:43
void Start()
Starts the task execution using the default scheduler.
TaskPtr ContinueWith(const Action< TaskPtr > &continuationAction)
Creates a continuation that executes when the task completes.
void WaitAll(const ArrayPtr< TaskPtr > &tasks, const CancellationToken &cancellationToken)
Waits for all of the provided Task objects to complete execution.
int32_t WaitAny(const ArrayPtr< TaskPtr > &tasks, const CancellationToken &cancellationToken)
Waits for any of the provided Task objects to complete execution.
TaskPtr Delay(int32_t millisecondsDelay)
Creates a task that completes after a time delay.
TaskPtr WhenAll(const ArrayPtr< TaskPtr > &tasks)
Creates a task that will complete when all of the supplied tasks have completed.
TaskPtr Run(const Action<> &action)
Queues the specified work to run on the thread pool and returns a Task handle for that work.
TaskPtr FromException(const Exception &exception)
Creates a task that has completed with a specified exception.
RTaskPtr< TResult > FromResult(TResult result)
Creates a task that has successfully completed with the specified result.
Definition: task_utils.h:101
RTaskPtr< TaskPtr > WhenAny(const SharedPtr< Collections::Generic::IEnumerable< TaskPtr > > &tasks)
Creates a task that will complete when any of the supplied tasks have completed.
Runtime::CompilerServices::YieldAwaitable Yield()
Creates an awaitable task that asynchronously yields back to the current context when awaited.
TaskPtr FromCanceled(const CancellationToken &cancellationToken)
Creates a task that has completed due to cancellation with the specified token.
Definition: db_command.h:9
MulticastDelegate< void(Args...)> Action
Delegate type that references methods that have no return value.
Definition: action.h:40