LoginSignup
1
3

More than 5 years have passed since last update.

タスクの初期化処理を待ってから先に進ませる

Last updated at Posted at 2018-07-21

開始した別タスクの初期化処理を待ってから先に進めたい場合にManualResetEventSlimが使えます。以下の例では、Service関数が別タスクの処理で初期化処理を行ってからループ処理しています。ServiceAsync関数は初期化処理をまってからreturnします。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main start.");
            var mres = new ManualResetEventSlim();
            var task = ServiceAsync(mres);
            task.Wait();
            mres.Dispose();
            Console.WriteLine("Main end.");
        }

        private static Task ServiceAsync(ManualResetEventSlim mres)
        {
            Console.WriteLine("ServiceAsync start.");
            var task = Task.Factory.StartNew(() => Service(mres));
            mres.Wait();  // Service関数内のmres.Set()で先に進みます。
            Console.WriteLine("ServiceAsync end.");
            return task;
        }

        private static void Service(ManualResetEventSlim mres)
        {
            Console.WriteLine("Service start.");

            // 初期化処理
            Console.WriteLine("Service initialize start.");
            Thread.Sleep(3000);
            Console.WriteLine("Service initialize end.");
            mres.Set();  // ServiceAsync関数側に通知します。

            // ループ処理
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000);
            }
            Console.WriteLine("Service end.");
        }
    }
}

出力例
Main start.
ServiceAsync start.
Service start.
Service initialize start.
Service initialize end.
ServiceAsync end.
Service end.
Main end.

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3