2015-11-11 15 views
-1

現在我使用的方法,更新所有時間連接事件引發,但現在連接我使用不同的線程我有問題從Icommand線程調用該事件我得到一個錯誤System.StackOwverflowException ,我在互聯網上閱讀這個問題和這個問題,我認爲凸輪用Invoker解決,但我不明白調用者如何使用它的概念。MethodInvoker的按鈕

我的代碼:

public class NewMeasurementCommand : ICommand 
    { 

     private MeasurementViewModel measurementViewModel = null; 
     private BaseViewModel baseViewModel; 
     private GpfGateway gpfGateway; 

     public NewMeasurementCommand(MeasurementViewModel viewModel) 
     { 

      measurementViewModel = viewModel; 
      GpfGateway.GetInstance().SystemStatus += updateCanExecuteChanged; 

     } 
     /// <summary>Notifies command to update CanExecute property.</summary> 
     private void updateCanExecuteChanged(object sender, EventArgs e) 
     { 
      updateCanExecuteChanged(sender, new EventArgs()); 
     } 
     bool ICommand.CanExecute(object parameter) 
     { 

      return GpfGateway.GetInstance().IsConnected; 

     } 

     public event EventHandler CanExecuteChanged; 

     void ICommand.Execute(object parameter) 
     { 
      NewMeasurementViewModel newMeasurementViewModel = new NewMeasurementViewModel(); 
      measurementViewModel.MeasurementModel.MeasurementStep = new MeasurementInfoStep(); 
      measurementViewModel.MeasurementModel.MeasurementStep.NewMeasurementVM = newMeasurementViewModel; 
      GpfGateway.GetInstance().ControllerValuesArrived += measurementViewModel.MeasurementModel.MeasurementStep.RemoteControllerArrived; 
      newMeasurementViewModel.MeasurementModel = measurementViewModel.MeasurementModel; 
      newMeasurementViewModel.MeasurementModel.CurrentMeasurement = new Measurement(); 
      measurementViewModel.MeasurementModel.MeasurementStep.CurrentMeasurement = newMeasurementViewModel.MeasurementModel.CurrentMeasurement; 
      newMeasurementViewModel.NavigationResolver = measurementViewModel.NavigationResolver; 
      measurementViewModel.MeasurementModel.CurrentMeasurement = new Measurement(); 
      measurementViewModel.MeasurementModel.MeasurementStep.CurrentMeasurement = measurementViewModel.MeasurementModel.CurrentMeasurement; 
      measurementViewModel.MeasurementModel.CurrentMeasurement.Tester = Environment.UserName; 
      measurementViewModel.NavigationResolver.GoToMeasurementInfoStep(newMeasurementViewModel); 
     } 
     private void updateCanExecuteChanged(object sender, NotifyCollectionChangedEventArgs e) 
     { 
      CanExecuteChanged(this, new EventArgs()); 
     } 
} 
} 

我嘗試什麼讓:

public delegate void InvokeDelegate(); 

     private void EnabledChanged(object sender, EventArgs e) 
     { 

      this.BeginInvoke((MethodInvoker)delegate 
      { 
       EnabledChanged(); 
      }); 



       if(sender == gpfGateway.IsConnected); 
     } 

如果任何人有一些意見,將是非常有益的。

+1

這是你有問題的地方:private void updateCanExecuteChanged }該方法經常執行自身,直到遇到堆棧溢出。 –

+0

[Invoker](http://hydra-media.cursecdn.com/dota2.gamepedia.com/5/59/Invo_cast_01.mp3)。試試這個> https://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker(v=vs.110).aspx – ntohl

回答

2

因爲你的EnabledChanged函數調用它自己,你會得到堆棧溢出。所以它一直在回顧自己,直到它興起。

如果你看一下Microsofts invoke

你會看到他們不從自身調用函數,而是從別的地方。

你可以做的就是這樣的事情

private void UpdateStatus(String message) 
{ 
    if (this.InvokeRequired) 
     this.Invoke((MethodInvoker)delegate 
     { 
      UpdateStatus(message); 
     }); 
    else 
     label1.Text = message; 
} 

雖然這是一個標籤,它仍然是一個合理例如在設置文本。任何GUI元素都不能在另一個線程中播放,因此,您可以在任何地方使用像這樣的函數,如果需要的話,然後調用該命令。在這種情況下,你可以調用它自己,因爲調用它之後不需要再次調用它自己。 (發送者,新的EventArgs());

+0

我試過這個方法,但我想我需要使用因爲我的編譯器不識別第十個方法,所以調用lib。任何想法爲什麼不承認這種方法? – user3223293

+0

'私人無效updateCanExecuteChanged(對象發件人,EventArgs的) { 如果(this.InvokeRequired) this.Invoke((MethodInvoker)代表 { updateCanExecuteChanged(發件人,新的EventArgs()); }); else CanExecuteChanged(this,new EventArgs()); } – user3223293