開始した別タスクの初期化処理を待ってから先に進めたい場合に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.