2014-08-29 6 views
0

그래서 원래 발신자 트리의 부모 호출자가 내 메인 윈도우의로드 기능인 코드 섹션이있었습니다. 이제 내 OS를 다시 시작할 때마다 beginInvoke (Windows 컨트롤이 아직 초기화되지 않았고 참조하려고 시도 함) 오류가 발생했습니다. 많은 사람들이 무언가가로드되면 부울을 추가하기 위해 이벤트를 표시된 이벤트로 이동 시키겠다는 제안을했으나 결코 문제를 제거하지 못했습니다. 내가 머리카락을 꺼낼 때부터 멀티 스레딩을 제거했다.호출시 스레딩 확인

 'send broadcast on network  
    Dim tasksArr(1) As Task 
    Dim brand1SearchTask= Task(Of List(Of device)).Factory.StartNew(Function() getbrand1()) 
    Dim brand2SearchTask= Task(Of List(Of device)).Factory.StartNew(Function() getbrand2()) 

    Try 
     tasksArr(0) = brand1SearchTask 
     tasksArr(1) = brand2SearchTask 
     Task.WaitAll(tasksArr) 
    Catch ex As Exception 

    End Try 

    Try 
     Try 
      deviceList.AddRange(brand1SearchTask.Result()) 
     Catch ex As Exception 
     End Try 

     deviceList.AddRange(brand2SearchTask.Result()) 
    Catch ex As Exception 

    End Try 

이 코드는 NetworkSearch.FindDevices()라는 별개의 클래스에있는 함수 내에 있습니다. MainWindow_Load의 load 함수에서 호출됩니다.

그래서 내가 배운 것을 주된 문제는 작업 .start 또는 호출을 호출합니다 .Invoke, 그리고 내 양식이 그 시간에 초기화되지 않은 경우 Windows에서 불평합니다. 내가 가진 한 가지 해결책은 별도의 모듈을 만든 다음 내 주 창의 New() 양식을 만드는 것입니다. 오류가 제거되었지만 버튼을 클릭하여 다른 양식을 실행하는 등의 다른 창은 초기화되지 않았고 null 예외가 발생했습니다.

내 질문 : 아직 작업 또는 스레딩 환경에서 초기화 된 다음 내 스레드에 들어가기를 기다리는 좋은 방법은 무엇입니까? 이 컨트롤에 대한 대리자 함수를 만들고 편집 할 수 있지만 여기에 정말 직접 GUI를 건드리지 않습니다.

모듈을 만들어 주려면, 그것에서 새로운() 기본 양식을 만들고,하지만 내 양식의 나머지

이사를 거기에서 발사 할 때 아무것도 객체되지 않았다 : 나는 시도 무엇

주 양식에 표시됨 (여전히 호출 오류가 시작됨)

- 개인 하위 My_application 시작시 My.Settings.Loadfinished 부울을 사용하여 me.startup을 처리하고 제거하지 않았습니다.

걸러은이 말을 필요한 만 런타임에 불평 확인 "mainwindow.invokerequired" "나"대신

답변

0

특별히 때 UI 스레드에서 코드를 실행할 수 있도록 클래스를 설계하려면

  1. 유형 ISynchronizeInvoke의 클래스에 SynchronizingObject 속성을 선언합니다 : 그것은 다음 두 가지 옵션을 가지고있는 UI의 직접적인 지식이 없습니다. 내부적으로 해당 속성이 Nothing인지 테스트하고 그렇지 않은 경우 InvokeRequired 속성과 Invoke/BeginInvoke 메서드를 사용하십시오. 바깥 쪽에서 폼이나 다른 컨트롤을 해당 속성에 지정할 수 있습니다. 그것이 FileSystemWatcherTimers.Timer 클래스가 작동하는 방식입니다.

  2. SynchronizationContext 유형의 클래스에서 필드를 선언하고 SynchroinizationContext.Current으로 초기화하십시오. 클래스가 UI 스레드에서 인스턴스화 된 경우 해당 필드는 Nothing이 아니며 해당 Send/Post 메소드를 사용할 수 있습니다.