#include <xtd/xtd>
auto main() -> int {
auto tcs1 = task_completion_source<int> {};
auto t1 = tcs1.task();
auto tf = task_factory {}.start_new([tcs1] mutable {
thread::sleep(1000);
tcs1.set_result(15);
});
auto sw = diagnostics::stopwatch::start_new();
auto result = t1.result();
sw.stop();
println("(Elapsed time={}): t1.result={} (expected 15) ", sw.elapsed_milliseconds(), result);
auto tcs2 = task_completion_source<int> {};
auto t2 = tcs2.task();
tf = task_factory {}.start_new([tcs2] mutable {
thread::sleep(1000);
tcs2.set_exception(invalid_operation_exception("SIMULATED EXCEPTION"));
});
sw = diagnostics::stopwatch::start_new();
try {
result = t2.result();
console::write_line("t2.result succeeded. THIS WAS NOT EXPECTED.");
} catch (const exception& e) {
console::write_line("(Elapsed time={}): ", sw.elapsed_milliseconds());
console::write_line("The following exceptions have been thrown by t2.result: (THIS WAS EXPECTED)");
console::write_line("\n-------------------------------------------------\n{}", e.to_string());
}
auto tcs3 = task_completion_source<int> {};
auto t3 = tcs3.task();
tf = task_factory {}.start_new([tcs3] mutable {
tcs3.set_canceled();
thread::sleep(1000);
tcs3.set_result(45);
});
sw = diagnostics::stopwatch::start_new();
try {
result = t3.result();
console::write_line("t3.result succeeded. THIS WAS NOT CANCELD.");
} catch (const task_canceled_exception& e) {
console::write_line("(Elapsed time={}): ", sw.elapsed_milliseconds());
console::write_line("The task_canceled_exception have been thrown by t3.result: (THIS WAS CANCELED)");
}
}