[c#-4.0] 태스크가 백그라운드 스레드로 생성됩니까?

dot.net 4의 새 Task 클래스가 백그라운드 또는 포 그라운드 스레드를 생성하는지 궁금합니다.

일반적으로 스레드에 “IsBackground”를 설정했지만 태스크에는 이러한 속성이 없습니다.

MSDN에서 이에 대한 문서를 찾을 수 없었습니다 🙁



답변

확인하기 어렵지 않아야합니다.

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}

그리고 대답은 …

ǝnɹʇ


답변

Task<T>사용하여 시작하는 경우 Task.Run()예.

async및 을 사용하는 경우 await아니요. 여기 에서 발췌 :

“async 및 await 키워드는 추가 스레드를 생성하지 않습니다. 비동기 메서드는 자체 스레드에서 실행되지 않기 때문에 비동기 메서드는 멀티 스레딩이 필요하지 않습니다. 메서드는 현재 동기화 컨텍스트에서 실행되고 스레드에서 시간을 사용합니다. 메서드가 활성화 된 경우에만 가능합니다. Task.Run을 사용하여 CPU 바인딩 된 작업을 백그라운드 스레드로 이동할 수 있지만 백그라운드 스레드는 결과를 사용할 수 있기를 기다리는 프로세스에는 도움이되지 않습니다. “


답변

백그라운드 스레드로 실행되는 것 같습니다.

이 스레드를 참조하십시오 :

여러 C # 작업 비동기 실행


답변

작업은 시스템 스레드 풀에서 오는 스레드에 의해 실행됩니다. 스레드 풀에서 가져온 스레드는 기본적으로 백그라운드에서 실행됩니다.


답변

아직 백그라운드 작업이 확실하지 않은 경우 다음과 같은 작업 내에서 GUI 요소에 액세스 해보십시오.

public async Task<int> ProcessStuff_Async()
{
    while(true)
    {
        label1.Text = "processing next item";

런타임 예외를 얻으려면 :

크로스 스레드 작업이 유효하지 않음 : 컨트롤 ‘label1’이 생성 된 스레드가 아닌 다른 스레드에서 액세스되었습니다.

좋은 오래된 일반 백그라운드 스레드와 마찬가지로.

의 정보가 MSDN의 오피스 2017 등은 (:-), 예를 들면 :

이 처리하는 가장 좋은 방법은 … [시작하는 백그라운드 스레드 를 사용하여 작업을 수행 Task.Run를 하고 기다리고 그 결과를. 이렇게하면 작업이 진행되는 동안 UI가 매끄럽게 느껴질 수 있습니다.

이 문서에는 섹션도 What happens under the covers있습니다.


답변