프로그램을 닫기 전에 모든 작업이 완료되었는지 확인하십시오.

Vernou

내 프로그램에서 많은 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");
    });
}

이 전략에는 몇 가지 문제가 있습니다.

  • 컬렉션은 절대 청소되지 않으며 무기한 확장 될 수 있습니다.
  • 모든 작업 선언을 교체해야 함
  • ContinueWith를 관리하지 마십시오
  • 비동기 / 대기 관리 안 함

다른 전략 / 아이디어가 있습니까?

편집 : 작업 예를 복잡화하여 자식 작업을 생성합니다.

Efthymios Kalyviotis

정확히 무엇을 하려는지 확실하지 않지만 벨로우즈와 같은 것이 더 잘 맞을 수 있습니까?

작업이 종료 될 때마다 목록 (잠긴 항목)에서 제거되고 모든 작업이 종료 될 때까지 기다릴 수 있습니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파이썬 프로그램이 동전 던지기의 모든 조합을 인쇄하도록하십시오

분류에서Dev

종료하기 전에 열린 모든 프로그램을 자동 시작하지 않는 방법

분류에서Dev

코 루틴이 완료 될 수있는 작업을 수행하기 전에 시작되었는지 확인하는 방법이 있습니까?

분류에서Dev

대기열의 모든 작업이 완료되었지만 프로그램이 계속되지 않음

분류에서Dev

PBS 클러스터에 후속 작업을 제출하기 전에 사용자의 모든 작업이 완료 될 때까지 기다리십시오.

분류에서Dev

Meteor CollectionFS : 표시하기 전에 이미지가 업로드되었는지 확인하십시오.

분류에서Dev

모든 프로세스가 완료되었지만 이상한 출력 후 대기를 사용하십시오.

분류에서Dev

읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

분류에서Dev

읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

분류에서Dev

시스템이 재부팅을 완료하기 전에 mdadm이 동기화되었는지 확인합니까?

분류에서Dev

Xcode8 Swift 3에서 다른 작업으로 이동하기 전에 ViewController의 모든 작업을 완료하십시오.

분류에서Dev

다른 페이지로 이동하기 전에 리듀서 응답 작업이 완료되었는지 어떻게 확인합니까?

분류에서Dev

중첩 된 foreach 내에서 진행하기 전에 모든 비동기 호출이 완료되었는지 확인하는 방법

분류에서Dev

0에서 100 사이의 모든 숫자를 더하는 프로그램을 작성하십시오. 결과를 인쇄하십시오.

분류에서Dev

비동기가 작업을 완료하기 전에 프로그램이 종료되는 이유는 무엇입니까?

분류에서Dev

일시 중지에서 다시 시작-모든 프로그램이 닫힘 12.04

분류에서Dev

작업을 수행하기 전에 모든 확인란이 선택되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

종료하기 전에 C # winforms 응용 프로그램이 특정 함수를 호출하는지 확인하십시오.

분류에서Dev

목록에서 반복되는 모든 숫자를 제거하는 프로그램을 작성하십시오.

분류에서Dev

hitTestObject가 배열의 모든 요소로 완료되었는지 확인하십시오.

분류에서Dev

모든 이미지가 완전히로드되었는지 확인하는 Angular 지시문

분류에서Dev

Ctrl + C를 누른 후 프로그램이 중지되기 전에 Python이 작업을 완료하도록하려면 어떻게해야합니까?

분류에서Dev

계속하기 전에 폴더 트리가 완료되었는지 확인하십시오.

분류에서Dev

모든 작업이 완료되기 전에 ThreadPoolExecutor 종료

분류에서Dev

프로그램이 완료되기 전에 QML 창을 표시하는 방법은 무엇입니까?

분류에서Dev

bash를 사용하여 한 프로그램이 다른 프로그램을 시작하기 전에 시작할 시간이 있는지 확인

분류에서Dev

Qt에서 QApplication :: processEvents ()를 사용할 때 모든 창이 닫혔는지 확인하십시오.

분류에서Dev

목록을 할당하기 전에 queryable이 null인지 확인하십시오.

분류에서Dev

/ dev / sysdig0 장치 열기 오류 : sysdig-probe 모듈이로드되었는지 확인하십시오.

Related 관련 기사

  1. 1

    파이썬 프로그램이 동전 던지기의 모든 조합을 인쇄하도록하십시오

  2. 2

    종료하기 전에 열린 모든 프로그램을 자동 시작하지 않는 방법

  3. 3

    코 루틴이 완료 될 수있는 작업을 수행하기 전에 시작되었는지 확인하는 방법이 있습니까?

  4. 4

    대기열의 모든 작업이 완료되었지만 프로그램이 계속되지 않음

  5. 5

    PBS 클러스터에 후속 작업을 제출하기 전에 사용자의 모든 작업이 완료 될 때까지 기다리십시오.

  6. 6

    Meteor CollectionFS : 표시하기 전에 이미지가 업로드되었는지 확인하십시오.

  7. 7

    모든 프로세스가 완료되었지만 이상한 출력 후 대기를 사용하십시오.

  8. 8

    읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

  9. 9

    읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

  10. 10

    시스템이 재부팅을 완료하기 전에 mdadm이 동기화되었는지 확인합니까?

  11. 11

    Xcode8 Swift 3에서 다른 작업으로 이동하기 전에 ViewController의 모든 작업을 완료하십시오.

  12. 12

    다른 페이지로 이동하기 전에 리듀서 응답 작업이 완료되었는지 어떻게 확인합니까?

  13. 13

    중첩 된 foreach 내에서 진행하기 전에 모든 비동기 호출이 완료되었는지 확인하는 방법

  14. 14

    0에서 100 사이의 모든 숫자를 더하는 프로그램을 작성하십시오. 결과를 인쇄하십시오.

  15. 15

    비동기가 작업을 완료하기 전에 프로그램이 종료되는 이유는 무엇입니까?

  16. 16

    일시 중지에서 다시 시작-모든 프로그램이 닫힘 12.04

  17. 17

    작업을 수행하기 전에 모든 확인란이 선택되었는지 확인하는 방법은 무엇입니까?

  18. 18

    종료하기 전에 C # winforms 응용 프로그램이 특정 함수를 호출하는지 확인하십시오.

  19. 19

    목록에서 반복되는 모든 숫자를 제거하는 프로그램을 작성하십시오.

  20. 20

    hitTestObject가 배열의 모든 요소로 완료되었는지 확인하십시오.

  21. 21

    모든 이미지가 완전히로드되었는지 확인하는 Angular 지시문

  22. 22

    Ctrl + C를 누른 후 프로그램이 중지되기 전에 Python이 작업을 완료하도록하려면 어떻게해야합니까?

  23. 23

    계속하기 전에 폴더 트리가 완료되었는지 확인하십시오.

  24. 24

    모든 작업이 완료되기 전에 ThreadPoolExecutor 종료

  25. 25

    프로그램이 완료되기 전에 QML 창을 표시하는 방법은 무엇입니까?

  26. 26

    bash를 사용하여 한 프로그램이 다른 프로그램을 시작하기 전에 시작할 시간이 있는지 확인

  27. 27

    Qt에서 QApplication :: processEvents ()를 사용할 때 모든 창이 닫혔는지 확인하십시오.

  28. 28

    목록을 할당하기 전에 queryable이 null인지 확인하십시오.

  29. 29

    / dev / sysdig0 장치 열기 오류 : sysdig-probe 모듈이로드되었는지 확인하십시오.

뜨겁다태그

보관