좋아 내가 스레드를 사용하여 아주 새로운 해요하지만 지금까지 나는 다음과 같은 얻을 관리했습니다 :는
Private Delegate Sub dlgUpdateText(text as string)
Private Sub UpdateStatus(text as string)
If rtxStatus.InvokeRequired then
Dim dlg as new dlgUpdateText(AddressOf UpdateStatus)
Me.Invoke(dlg, text)
Else
rtxStatus.text = text
End If
End Sub
을 내 비동기 BackgroundWorker에에서 나는
(I 잘못된 스레드에서 컨트롤을 통해 업데이트하기 때문에 오류 발생) 내 원래의 코드 그러나 확인을 작동하는 것 같다UpdateStatus("Some text")
내가 (부자) 텍스트 상자에 추가하려면 다음 코드를 사용 전화 :
rtxStatus.Select(rtxStatus.TextLength, 0)
rtxStatus.SelectionColor = Color.Red
rtxStatus.AppendText("Some error occurred gathering data")
제 질문은 텍스트를 바꾸기보다는 새 코드를 어떻게 수정해야합니까? 델리게이트 사용에 대한 몇 가지 지침을 읽었지만 몇 가지 점에서 여전히 분실되어 있으므로 내가 가진 코드로 어떤 일이 벌어지고 있는지 실제로 알 수 없습니다. (아마 나에게 설명 필요가 무엇인지 보여주기 위해 최선의 봉사!)
보너스 질문 :
- 위임 하위 실제로 무엇을 하는가? 주 Sub (UpdateStatus)에 이미 전달 된 속성 (텍스트)을 보유하는 것 이외의 다른 용도로 사용되지 않는 것 같습니다.
- Me.Invoke가 호출되면 어떻게됩니까? Me는 현재 양식이므로 Delegate Sub와 텍스트를 전달할 때 텍스트는 rtxSTatus.Text 속성에 전달되어야합니다.
- UpdateStatus는 주 스레드 (?)에서 실행되며 배경 작업자 스레드 중 하나에서 호출되므로 Invoke가 필요하거나 UpdateStatus Sub가 호출 된 백그라운드 스레드에서 실행되는 이유는 무엇입니까? Else 문에 적용된 텍스트를 변경하여 실행 된 것을 확인하면 Invoke를 사용하여 상자의 텍스트를 변경하지 않는 것 같습니다.
어떤 도움을 주시면 정말 감사하겠습니다. 감사합니다.
하지만 방법은 흥미로운 같습니다
는이 정보와 방법은 다음 링크에서이를 구현하는 방법을 찾을 수 있습니다. 이것을 처리하는 훨씬 더 깔끔한 방법으로 보이기 때문에 나는 그것을 분명히 시도 할 것입니다. – LostRob