내 프로그램에서 많은 Task가 시작됩니다. 이 작업은 다른 작업을 시작할 수 있습니다. 그러나 프로그램이 닫히면 (Main 메서드의 끝) 실행중인 모든 작업이 작업 중간에 중지됩니다.
프로그램이 종료되면 종료 프로세스가 모든 작업을 기다립니다. 이를 위해 모든 시작된 작업을 등록하고 마지막 명령에서 모든 등록 작업을 기다립니다.
public static class HostedTask
{
private readonly static ConcurrentQueue<Task> _tasks = new ConcurrentQueue<Task>();
public static void Run(Action action)
{
var task = Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);
_tasks.Enqueue(task);
}
public static void Wait()
{
while (_tasks.Any())
{
if (_tasks.TryDequeue(out Task task))
{
task.Wait();
}
}
}
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
for (int i = 0; i < 100; i+= 10)
{
LongBackgroundWork(i);
}
HostedTask.Wait();
}
static void LongBackgroundWork(int id)
{
HostedTask.Run(() =>
{
Console.WriteLine(id + " Begin");
Thread.Sleep(TimeSpan.FromSeconds(10));
Console.WriteLine(id + " End");
for (var i = id + 1; i < id + 10; i++)
ChildWork(i);
});
}
static void ChildWork(int id)
{
HostedTask.Run(() =>
{
Console.WriteLine(id + " Begin");
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine(id + " End");
});
}
이 전략에는 몇 가지 문제가 있습니다.
다른 전략 / 아이디어가 있습니까?
편집 : 작업 예를 복잡화하여 자식 작업을 생성합니다.
정확히 무엇을 하려는지 확실하지 않지만 벨로우즈와 같은 것이 더 잘 맞을 수 있습니까?
작업이 종료 될 때마다 목록 (잠긴 항목)에서 제거되고 모든 작업이 종료 될 때까지 기다릴 수 있습니다.
public static class HostedTask
{
private readonly static List<Task> _tasks = new List<Task>();
private static Object taskLocker = new object();
public static async Task Run(Action action)
{
var task = Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);
lock (taskLocker)
_tasks.Add(task);
await task;
lock (taskLocker)
_tasks.Remove(task);
}
public static void Wait()
{
IEnumerable<Task> anys;
do
{
lock (taskLocker)
{
anys = _tasks.Where(t => !t.IsCompleted);
}
if ((anys != null) && (anys.Count() > 0))
Task.WhenAll(anys).Wait();
else return;
} while (true);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
for (int i = 0; i < 100; i++)
{
LongBackgroundWork(i);
}
ShortBackgroundWork(-1);
HostedTask.Wait();
}
static Task LongBackgroundWork(int id)
{
return HostedTask.Run(() =>
{
Console.WriteLine(id + " Begin");
Thread.Sleep(TimeSpan.FromSeconds(10));
Console.WriteLine(id + " End");
});
}
static Task ShortBackgroundWork(int id)
{
return HostedTask.Run(() =>
{
Console.WriteLine(id + " Begin");
Thread.Sleep(TimeSpan.FromSeconds(1));
Console.WriteLine(id + " End");
});
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다