아직 완전히 비동기/대기 방식을 이해하는 데 어려움을 겪고 있습니다. 누군가 주제에서 진짜로 Task.Run 뒤에 기다리고 있는지 말해 줄 수 있습니까? 비동기 메서드를 사용하지 않고 Task.Run을 수행하는 경우가 있습니다. 올바른 방법은 무엇입니까?정말 기다리고 있습니까 Task.Run()
답변
아니요, async await은 코드가 실행되는 동안 다른 작업을 차단하고 Task.Run을 수행하지 않거나 새 스레드를 시작하기위한 것입니다.
https://blog.stephencleary.com/2013/11/there-is-no-thread.html은 그에 대한 설명입니다.
async
연산자는 메서드에서 await
연산자를 사용하기 만하면됩니다. await
연산자는 이 (가) 일 수있는 모든 작업을 수행합니다. .NET에서 Task
및 Task<T>
은 의 몇 가지 예이며, 초입니다.
Task.Run
반환 Task
및 Task.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;
}
당신이 비동기를 사용하여 제한하고 기다리고되는 경우가 있습니다 - 이것은 왜 것 일반적이다 때로 Task.Run이 대신 사용되는 것을 볼 수 있습니다 - 동기식 메서드에서 비동기 코드를 사용할 수 있습니다.
MVC를 자식 작업과 함께 사용할 경우 프레임 워크가 비동기 하위 작업을 지원하지 않으므로 Task.Run을 사용하여 비동기 코드를 호출해야합니다.
정말로 Task.Run 뒤에 기다리고 있습니까?
다른 사람들은 이미 C# 동시성에 관한 Cleary의 많은 훌륭한 블로그 게시물 중 하나 인 There Is No Thread에 연결되어 있습니다.
아니오, 뒤에서 Task.Run
을 사용하지 않습니다.
await
은 단지 Task.Run
이상에 유용합니다. 뭔가를 완료 한 후 코드를 실행하기위한 것입니다. 그 일은 Task.Run
으로 만든 계산 작업 일 수 있지만, 예를 들어 ReadLineAsync
과 같은 데이터 검색 일 수도 있습니다. Task
은 그 모든 일을 모델링하는 데 사용되는 클래스입니다.
Task.Run
은 used이고 스레드 풀에서 작업을 대기열에 넣기위한 것입니다. 이는 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.- 1. Task.Run
- 2. Task.Run Serial Communications
- 3. 비동기입니까? 별도의 스레드가 실행 되길 기다리고 있습니까?
- 4. Task.Run 스레드에 HttpContext 전달
- 5. Response.Cookies.Add가 확인을 기다리고 있습니까?
- 6. IE #가로드되기를 기다리고 있습니까?
- 7. 탐색 pushasync에서 기다리고 있습니까?
- 8. 비동기식 모델 또는 동기 모델이 발생하기를 기다리고 있습니까?
- 9. Task.Run 코드가 실행되지 않습니다.
- 10. Selenium Webdriver가 url을 기다리고 있습니까?
- 11. 는 Task.CompletedTask가 무엇을 기다리고 있습니까?
- 12. JBoss에서 "적절한 배포자를 기다리고 있습니까?"
- 13. 서버에서 이벤트가 발생하기를 기다리고 있습니까?
- 14. 내 프로세스가 입력을 기다리고 있습니까?
- 15. PHP와 컬 - 무엇을 기다리고 있습니까?
- 16. 계속하기 전에 JFrame이로드되기를 기다리고 있습니까?
- 17. FB openActiveSession이 완료되기를 기다리고 있습니까?
- 18. 내 프로그램은 어디에서 기다리고 있습니까?
- 19. Task.Run()와 Task.Factory.StartNew()
- 20. ASP.NET HttpContext.Current Task.Run 내부
- 21. 잘못된 반환 형식 Task.Run
- 22. 정적 초기화 프로그램의 Task.Run
- 23. 정말 양식에 무엇이 있습니까?
- 24. IDE가 정말 가치가 있습니까?
- 25. Task.Run 래핑 된 메서드에서 예외가 catch되지 않았습니다.
- 26. Task.Run 및 Func <>
- 27. Task.Run()에 async/await가 필요합니까?
- 28. await task.run vs await C#
- 29. Syncronous asp.net 컨트롤러에서 Task.Run 사용
- 30. Async-await Task.Run vs HttpClient.GetAsync
아니, 그것은하지 않습니다. Stephen Cleary가 [스레드 없음] (https://blog.stephencleary.com/2013/11/there-is-no-thread.html)을 발견했을 것입니다. –