2014-06-06 2 views
0

나는 키 넥트와 WPF 응용 프로그램을 작성하려고, 그래서 나는이 코드를 쓰기가 :대리인 BackgroundWorker를 사용하는 방법?

[System.InvalidOperationException] = {"The calling thread cannot access this object because a different thread owns it."}" 

:이 코드 this.sensorChooserUi.KinectSensorChooser = this.sensorChooser;, 내가 가진이 오류를 실행하려고 할 때 그래서

static BackgroundWorker _bw = new BackgroundWorker(); 
    _bw.DoWork += bw_DoWork; 
    _bw.RunWorkerAsync(); 

    dispatcherTimerGame = new System.Windows.Threading.DispatcherTimer(); 
    dispatcherTimerGame.Tick += new EventHandler(dispatcher_VerificaCarte); 
    dispatcherTimerGame.Interval = new TimeSpan(0, 0, 1); 
    dispatcherTimerGame.Start(); 

    void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     try 
     { 
      this.sensorChooser = new KinectSensorChooser(); 
      this.sensorChooser.KinectChanged += SensorChooserOnKinectChanged; 
      this.sensorChooserUi.KinectSensorChooser = this.sensorChooser; 
      this.sensorChooser.Start(); 
      this.sensor = this.sensorChooser.Kinect; 
      if (this.sensor != null) 
      { 
      DateTime dat1 = DateTime.Now; 
      string date = DateTime.Now.ToString("dd-MMM-yy HH-mm"); 
      acquisizioneVideo = new Acquisizione("Video" + date + ".avi"); 
      this.sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); 
      acquisizioneAudio = new AcquisizioneWaveAudio(180, this.sensor, "Audio" + date + ".wav");  acquisizioneAudio.recordAudio(); 
      acquisizioneVideo.recordVideo(); 

      this.sensor.ColorFrameReady += acquisizioneVideo.ColorImageReady; 

      } 
     } 
    catch (Exception exc) 
    { 
     log.Error(exc); 
    } 
} 

을 어떻게 해결할 수 있습니까?

답변

0

당신은 당신이 디스패처 통화에서 이러한 코드를 포장해야 할 수도 있습니다

this.Dispatcher.Invoke(() => 
     this.sensorChooser = new KinectSensorChooser(); 
     this.sensorChooser.KinectChanged += SensorChooserOnKinectChanged; 
     this.sensorChooserUi.KinectSensorChooser = this.sensorChooser; 
     this.sensorChooser.Start(); 
     this.sensor = this.sensorChooser.Kinect; 
}); 

같은 주 스레드에서 같은 통화를 호출해야합니다.

일반적으로 이러한 요소에 대한 호출은 스레드 선호도를 가지므로 해당 스레드가 작성된 동일한 스레드를 사용하여 호출해야합니다. 귀하의 경우 this.sensorChooserUi는 다른 스레드 다음에 this.sensorChooser로 작성됩니다.

업데이트 당신이 선택적으로 비동기를 실행할 수있는 코드의 조각을 선택 할 수 있습니다

. 일반적으로 모든 코드가 비동기가되는 것은 아닙니다. 따라서 코드의 값 비싼 부분을 식별하고 허용되는 경우에만 비동기로 수행하십시오. 보통 IO 호출, 네트워크 호출은 비동기를위한 좋은 후보입니다. 다른 접근법은 코드의 취약 부분을 찾아서 디스패처 호출로 감싸는 것입니다.

+0

감사합니다.하지만 Kinect가 초기화 될 때 다른 코드를 실행하고 싶기 때문에 BackgroundWorker를 사용했습니다. main 메소드에서이 코드를 작성하면 AsyncTask가 없습니다 – bircastri

+0

가능하면 다른 비동기 코드를 실행할 수 있습니다. – pushpraj

관련 문제