>

단순한 BackgroundWorker 가 있습니다  결과를 생성해야하지만 호출 메소드로 다시 가져 오는 방법을 모르겠습니다. 나는 많은 답변을 읽었으며 모두 RunWorkerCompleted 가 어떻게  이벤트는 DoWork 의 결과를 수신 할 수 있습니다  이를 증명하기 위해 결과와 함께 메시지 상자를 표시합니다. 그것은 모두 좋지만 RunWorkerAsync 라는 실제 방법으로 어떻게 결과를 얻습니까? ?

myResult=myBackGroundWorker.RunWorkerAsync(); // This obviously doesn't compile

이 답변은 특히 매우 유용했습니다 :

BackgroundWorker가 객체를 반환하도록하는 방법

하지만 여전히 결과에 액세스하는 방법을 모르겠습니다. 이 답변에는 대리인의 사용에 대해서도 언급되어 있습니다.

BackgroundWorker가 값을 반환합니까?

그러나 이것이 문제를 해결할 수 있는지, 아니면 여전히 RunWorkCompleted 이벤트 핸들러 내에서 결과를 얻을 수 있는지 이해가되지 않습니다.


  • 답변 # 1

    짧은 대답 : 할 수 없습니다.

    <시간>

    RunWorkerAsync 를 호출 한 메소드에 값을 돌려주는 것이 무엇을 의미하는지 생각해보십시오 . 이는 메소드가 실행을 일시 정지하고 백그라운드 작업자가 작업을 완료 할 때까지 기다렸다가 다시 계속해야 함을 의미합니다. 그러나 대기하는 동안 다른 방법을 계속 실행하려면 UI가 중지됩니다.

    그 소리가 당신에게 친숙한가요? 그것은 기본적으로 무엇 async 입니다   await 를 만나면 메소드가 수행  표현!

    BackgroundWorker  꽤 오래된 API이며 async/await가 나왔을 때 멋진 기능이 없었습니다 (async/await는언어기능입니다). 이벤트를 사용하여 트릭을 수행하는 이유입니다. . 당시에는 비동기식으로 작업을 수행하고 호출자에게 값을 우아하게 되돌릴 방법이 없었습니다.

    이제 async/await가 있으므로이를 사용하여 원하는 작업을 수행 할 수 있습니다.

    someReuslt = await Task.Run(() => { ... });
    
    

    비동기/대기에 대해 전혀 들어 본 적이 없다면 시작하기에 좋은 곳입니다.

관련 자료

  • 이전 Python, CSV, Quandl API
  • 다음 하스켈 타입 스크립트 맵 함수