スレッドは生成・破棄に時間がかかる(下手すりゃ秒単位)。そこでスレッドプール等の運用方法が考案され、効率化が図られてきた。
しかしそれらを実装するのは結構な手間で、プログラマが一々手を煩わせるべきではない。
そのような要望から生まれたのがTaskで、効率的なスレッドの運用を内部で勝手にやってくれる。
という事らしい。
参考文献
https://stackoverflow.com/questions/31531697/c-cli-using-iprogress-in-task
https://teratail.com/questions/82895
using namespace System; //パラメータ受け渡し用のクラス public ref class CParam { public: int i; }; //一つのタスクとなるクラス public ref class MyClass { CParam^ param; System::Threading::Tasks::Task^ myTask; public: MyClass(int k) { param = gcnew CParam; param->i = k; } void TaskMethod(Object^ obj);//スレッドで走る関数 void Start(); void Wait(); }; //スレッドを開始する関数 void MyClass::Start() { myTask = System::Threading::Tasks::Task::Factory->StartNew( gcnew System::Action<Object^>(this, &MyClass::TaskMethod), (Object^)param); } //終了まで待機 void MyClass::Wait() { myTask->Wait(); } //処理本体 void MyClass::TaskMethod(Object^ obj) { CParam^ cp = (CParam^)obj; for (int j = 0; j < 100; j++) { Console::WriteLine(System::String::Format("{0}", cp->i + j)); } } ///////////////////////////////////////////////////// int main(array<System::String ^> ^args) { MyClass^ mc1 = gcnew MyClass(100); MyClass^ mc2 = gcnew MyClass(200); MyClass^ mc3 = gcnew MyClass(300); mc1->Start(); mc2->Start(); mc3->Start(); mc1->Wait(); mc2->Wait(); mc3->Wait(); Console::Read(); return 0; }