멀티 스레딩으로 이어지는 작업에 대해 언제 걱정해야합니까?

user1676558

다음과 같은 코드가 있다고 가정합니다.

...
var task1 = DoWorkAsync(1);
var task2 = DoWorkAsync(2);
await Task.WhenAll(task1, task2);
...

private async Task DoWorkAsync(int n)
{
    // Async HTTP request that we ConfigureAwait(to be determined).

    // Some CPU-bound work that isn't thread-safe.
}

그래서 내가 WPF 앱 ConfigureAwait(false)에 있고 HTTP 요청에 있지 않다면 여기서 안전합니까? 두 HTTP 요청을 동시에 만들 수 있지만 작업은 UI 스레드에서 다시 시작해야하므로 CPU 바인딩 작업이 다중 스레드가 아닙니다. 그러나 그렇게 ConfigureAwait(false)하면 작업이 다른 스레드 풀 스레드에서 병렬로 CPU 바운드 작업을 다시 시작할 수 있으므로 문제가 있습니까?

내가 ASP.NET에 있다면 동기화 컨텍스트가 WPF와 같은 스레드와 관련이 없기 때문에 어느 쪽이든 발생할 수 있습니까?

콘솔 앱을 사용하면 어떻게 되나요?

어떻게 이야기 DoWorkAsync합니까? ' DoWorkAsync동시에하는 것은 안전하지 않다'고 말 합니까?

재 설계하는 일반적인 방법이 있습니까? 동시에 수행해야 할 중요한 부분은 CPU 바운드 작업이 아닌 HTTP 요청입니다. 그래서 잠금이나 다른 것을 사용합니까 (이전에 사용한 적이 없음)?

스티븐 클리어 리

따라서 WPF 앱에 있고 HTTP 요청에 대해 ConfigureAwait (false)를 사용하지 않는 경우 여기에서 안전합니까?

이것이 UI 스레드에서 호출되면 예, 맞습니다. UI 컨텍스트는 한 번에 하나의 스레드 만 허용하므로 (특정 UI 스레드) CPU 바인딩 부분은 UI 스레드에서 실행되며 서로 간섭하지 않습니다. 이것은 매우 일반적인 속임수입니다.

ConfigureAwait (false)를 수행하면 작업이 다른 스레드 풀 스레드에서 병렬로 CPU 바운드 작업을 재개 할 수 있으므로 문제가 발생합니까?

예. 왜냐하면 ConfigureAwait(false)"CPU 바운드 작업에는 컨텍스트가 필요하지 않습니다"를 의미하므로 스레드 풀에서 병렬로 실행할 수 있습니다.

ASP.NET에있는 경우

클래식 ASP.NET에는 한 번에 하나의 스레드 요청 컨텍스트가 있으므로 동일하게 작동합니다. 없는 경우 안전합니다 ConfigureAwait(false).

ASP.NET Core에는 요청 컨텍스트 없으므로 ( SynchronizationContext어쨌든은 아님) 해당 플랫폼에서 병렬로 실행할 수 있습니다. ASP.NET Core SynchronziationContext에 대한 블로그 게시물에서 이것을 "암시 적 병렬 처리"라고합니다 .

콘솔 앱을 사용하면 어떻게 되나요?

컨텍스트가 없으므로 병렬로 실행할 수 있습니다.

DoWorkAsync에 대해 어떻게 이야기합니까?

"이 방법은 비 자유 스레드가 필요합니다 SynchronizationContext."

자물쇠 같은 걸 사용하나요

이것이 최선의 접근 방식입니다. 예 :

private readonly object _mutex = new object();
private async Task DoWorkAsync(int n)
{
  await HttpRequestAsync().ConfigureAwait(false);
  lock (_mutex)
  {
    // Some CPU-bound work that isn't thread-safe.
  }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이 오류 로그에 대해 걱정해야합니까?

분류에서Dev

API 16+에서 2의 제곱이 아닌 텍스처에 대해 걱정해야합니까?

분류에서Dev

Java 멀티 스레딩 코드가 제대로 작동하지 않는 이유는 무엇입니까?

분류에서Dev

C의 간단한 멀티 클라이언트 서버 애플리케이션에서 생성 된 스레드를 언제 결합해야합니까?

분류에서Dev

apport에서 시스템 프로그램 문제가 감지되었습니다. 걱정해야합니까?

분류에서Dev

멀티 스레딩 중에 두 개의 문이 순차적으로 실행되도록하려면 어떻게해야합니까?

분류에서Dev

텍스트 (멀티 스레딩)에서 쉼표를 세는데, 제대로하고 있습니까?

분류에서Dev

microservices에 사용되는 멀티 스레딩해야 하는가?

분류에서Dev

Cassandra C ++ 드라이버의로드 밸런싱 선택에 대해 걱정해야합니까?

분류에서Dev

내 루프가 멀티 스레딩에서 제대로 실행되지 않습니다.

분류에서Dev

멀티 스레딩과 비교하여 선택을 언제 사용해야합니까?

분류에서Dev

새 컴퓨터의 화면 아티팩트가 드라이버 업데이트로 수정되었습니다. 걱정해야합니까?

분류에서Dev

Blocking IO를 사용한 멀티 스레딩으로 인해 Java에서 파일이 손상됨

분류에서Dev

멀티 스레딩으로 인해 "ValueError : 닫힌 파일에 대한 I / O 작업"오류가 발생합니다. 왜?

분류에서Dev

USB 드라이브에 대한 권한에 대해 걱정해야합니까?

분류에서Dev

멀티 맵에서 특정 중복을 제거하려면 어떻게해야합니까?

분류에서Dev

Node.js는 작업자 스레드를 사용한 멀티 스레딩으로 간주됩니까?

분류에서Dev

일련의 작업에 대해 "원 자성"을 구현하는 방법은 무엇입니까? (반드시 멀티 스레딩과 관련된 것은 아님)

분류에서Dev

LXQt에서 터치 스크린으로 멀티 터치 제스처를 사용하려면 어떻게해야합니까?

분류에서Dev

자바 멀티 스레딩 : 스레드는 목록에 액세스해야합니다.

분류에서Dev

"대상"이 엔터티 대신 언제, 무엇이 될 수 있으며 단일 엔터티 유형에 대해 작업 할 때 논리 이름을 확인해야합니까?

분류에서Dev

Ubuntu 사용자는 "Operation Windigo"에 대해 걱정해야합니까?

분류에서Dev

Ubuntu 사용자는 "Operation Windigo"에 대해 걱정해야합니까?

분류에서Dev

Flutter와 Dart 버전이 다른 것에 대해 걱정해야합니까?

분류에서Dev

setlocale 및 멀티 스레딩으로 정의되지 않은 동작?

분류에서Dev

멀티 스레딩 및 실행 프로세스 이해

분류에서Dev

C #에서 프로세서 / IO가 많은 멀티 스레딩 작업의 동시성을 제한하기 위해 토큰 시스템을 구현하는 방법은 무엇입니까?

분류에서Dev

멀티 플레이어 시나리오에서 클라이언트간에 업데이트 메시지를 직렬화하려면 어떻게해야합니까?

분류에서Dev

어떻게 자바 멀티 스레딩과 거대한 폴더에 압축을 해제 할 수 있습니다 - 선호 java8를?

Related 관련 기사

  1. 1

    이 오류 로그에 대해 걱정해야합니까?

  2. 2

    API 16+에서 2의 제곱이 아닌 텍스처에 대해 걱정해야합니까?

  3. 3

    Java 멀티 스레딩 코드가 제대로 작동하지 않는 이유는 무엇입니까?

  4. 4

    C의 간단한 멀티 클라이언트 서버 애플리케이션에서 생성 된 스레드를 언제 결합해야합니까?

  5. 5

    apport에서 시스템 프로그램 문제가 감지되었습니다. 걱정해야합니까?

  6. 6

    멀티 스레딩 중에 두 개의 문이 순차적으로 실행되도록하려면 어떻게해야합니까?

  7. 7

    텍스트 (멀티 스레딩)에서 쉼표를 세는데, 제대로하고 있습니까?

  8. 8

    microservices에 사용되는 멀티 스레딩해야 하는가?

  9. 9

    Cassandra C ++ 드라이버의로드 밸런싱 선택에 대해 걱정해야합니까?

  10. 10

    내 루프가 멀티 스레딩에서 제대로 실행되지 않습니다.

  11. 11

    멀티 스레딩과 비교하여 선택을 언제 사용해야합니까?

  12. 12

    새 컴퓨터의 화면 아티팩트가 드라이버 업데이트로 수정되었습니다. 걱정해야합니까?

  13. 13

    Blocking IO를 사용한 멀티 스레딩으로 인해 Java에서 파일이 손상됨

  14. 14

    멀티 스레딩으로 인해 "ValueError : 닫힌 파일에 대한 I / O 작업"오류가 발생합니다. 왜?

  15. 15

    USB 드라이브에 대한 권한에 대해 걱정해야합니까?

  16. 16

    멀티 맵에서 특정 중복을 제거하려면 어떻게해야합니까?

  17. 17

    Node.js는 작업자 스레드를 사용한 멀티 스레딩으로 간주됩니까?

  18. 18

    일련의 작업에 대해 "원 자성"을 구현하는 방법은 무엇입니까? (반드시 멀티 스레딩과 관련된 것은 아님)

  19. 19

    LXQt에서 터치 스크린으로 멀티 터치 제스처를 사용하려면 어떻게해야합니까?

  20. 20

    자바 멀티 스레딩 : 스레드는 목록에 액세스해야합니다.

  21. 21

    "대상"이 엔터티 대신 언제, 무엇이 될 수 있으며 단일 엔터티 유형에 대해 작업 할 때 논리 이름을 확인해야합니까?

  22. 22

    Ubuntu 사용자는 "Operation Windigo"에 대해 걱정해야합니까?

  23. 23

    Ubuntu 사용자는 "Operation Windigo"에 대해 걱정해야합니까?

  24. 24

    Flutter와 Dart 버전이 다른 것에 대해 걱정해야합니까?

  25. 25

    setlocale 및 멀티 스레딩으로 정의되지 않은 동작?

  26. 26

    멀티 스레딩 및 실행 프로세스 이해

  27. 27

    C #에서 프로세서 / IO가 많은 멀티 스레딩 작업의 동시성을 제한하기 위해 토큰 시스템을 구현하는 방법은 무엇입니까?

  28. 28

    멀티 플레이어 시나리오에서 클라이언트간에 업데이트 메시지를 직렬화하려면 어떻게해야합니까?

  29. 29

    어떻게 자바 멀티 스레딩과 거대한 폴더에 압축을 해제 할 수 있습니다 - 선호 java8를?

뜨겁다태그

보관