2017-05-20 2 views
-1

아직 완전히 비동기/대기 방식을 이해하는 데 어려움을 겪고 있습니다. 누군가 주제에서 진짜로 Task.Run 뒤에 기다리고 있는지 말해 줄 수 있습니까? 비동기 메서드를 사용하지 않고 Task.Run을 수행하는 경우가 있습니다. 올바른 방법은 무엇입니까?정말 기다리고 있습니까 Task.Run()

+5

아니, 그것은하지 않습니다. Stephen Cleary가 [스레드 없음] (https://blog.stephencleary.com/2013/11/there-is-no-thread.html)을 발견했을 것입니다. –

답변

0

async 연산자는 메서드에서 await 연산자를 사용하기 만하면됩니다. await 연산자는 이 (가) 일 수있는 모든 작업을 수행합니다. .NET에서 TaskTask<T>의 몇 가지 예이며, 초입니다.

Task.Run 반환 TaskTask.Run<T> 반환 Task<T>하고 난 당신이 그들에 await 수 있도록 그들이 모두 awaitable 말했다. 당신이 원하는 경우

당신은 당신의 자신의 awaitable 유형을 작성할 수 있습니다 : 당신은 그냥 awaitable을 간주되는의 요구 사항을 만족시킬 수 있는지 확인해야합니다. 이 있고GetAwaiter의 구현을 제공해야하며 그게 전부입니다.

public struct SimpleInt32Awaitable 
{ 
    public SimpleInt32Awaiter GetAwaiter() 
    { 
     return new SimpleInt32Awaiter(); 
    } 
} 

public struct SimpleInt32Awaiter 
{ 
    public bool IsCompleted { get { return true; } } 

    public void OnCompleted(Action continuation) 
    { 
    } 

    public int GetResult() 
    { 
     return 5; 
    } 
} 

그리고 지금 당신은이 작업을 수행 할 수 있습니다 : 여기 awaitableexample입니다

// Within some other class 
static async void SimpleWaitAsync() 
{ 
    SimpleInt32Awaitable awaitable = new SimpleInt32Awaitable(); 
    int result = await awaitable; 
} 
-1

당신이 비동기를 사용하여 제한하고 기다리고되는 경우가 있습니다 - 이것은 왜 것 일반적이다 때로 Task.Run이 대신 사용되는 것을 볼 수 있습니다 - 동기식 메서드에서 비동기 코드를 사용할 수 있습니다.

MVC를 자식 작업과 함께 사용할 경우 프레임 워크가 비동기 하위 작업을 지원하지 않으므로 Task.Run을 사용하여 비동기 코드를 호출해야합니다.

0

정말로 Task.Run 뒤에 기다리고 있습니까?

다른 사람들은 이미 C# 동시성에 관한 Cleary의 많은 훌륭한 블로그 게시물 중 하나 인 There Is No Thread에 연결되어 있습니다.

아니오, 뒤에서 Task.Run을 사용하지 않습니다.

await은 단지 Task.Run 이상에 유용합니다. 뭔가를 완료 한 후 코드를 실행하기위한 것입니다. 그 일은 Task.Run으로 만든 계산 작업 일 수 있지만, 예를 들어 ReadLineAsync과 같은 데이터 검색 일 수도 있습니다. Task은 그 모든 일을 모델링하는 데 사용되는 클래스입니다.

Task.Runused이고 스레드 풀에서 작업을 대기열에 넣기위한 것입니다. 이는 CPU 바운드 코드를 작성할 때 적합하지만 you shouldn't use Task.Run when dealing with IO-bound operations입니다.이 경우 비동기 코드 (아마도 async/await를 사용)는 WriteLineAsync과 같은 비동기 IO 메서드를 사용해야하며 앞에서 설명한 ReadLineAsync을 사용해야합니다.

Task.Run을 사용하여 작업자 스레드에서 차단 코드를 실행하는 것은 안티 패턴입니다. GUI 스레드의 차단을 해제한다고하더라도 결코 그렇게하고 싶지는 않습니다.

때때로 비동기 메소드를 사용하지 않고 Task.Run을 수행하는 사람들을 기다리는 사람들을 포함하여 비동기 metod를 수행하는 사람들이 있습니다. 올바른 방법은 무엇입니까?

당신은 참으로 Task.Run를 사용하여 Task을 만들 수 있으며, 단지 await 또는 ContinueWith를 사용하지 않고, 그것을 실행하자. 이들은 '불과 잊기'작업이라고합니다. 그들은 거의 좋은 생각이 아닙니다. await이 사용 된 경우와 달리 해당 작업에서 throw 된 모든 예외가 손실됩니다.

에 의해 설명 - 당신이 그것을 짐작 - 스티븐 클리어 리를 this StackOverflow answer.

관련 문제