2017-04-12 5 views
-1

での非同期は、だから私はそれをクリックしたときに実行されるボタンと機能の署名を持っています。私はもちろん、DateTimeを使用しています。私はそれが得ている2つのパラメータのためにそれを動作させる方法を知りたいだけです。コードを使用してボタンを押すと、ボタンの機能は、C#

編集:

は、だから私はいくつかの答えを試みたが、私は毎回例外を取得。 intresting部分は、私が実際にボタンをクリックしたときに例外が起こっていないということです。ちょうど私がそれを呼び出そうとしている時です。

コードは実際には私のコードではなく、Microsoftのopensanプロジェクトからです。 コード:

private async void StartCamera() 
{ 
    if (!CameraList.HasItems) 
    { 
     MessageArea.Text = "No cameras found; cannot start processing"; 
     return; 
    } 

    // Clean leading/trailing spaces in API keys. 
    Properties.Settings.Default.FaceAPIKey = Properties.Settings.Default.FaceAPIKey.Trim(); 
    Properties.Settings.Default.EmotionAPIKey = Properties.Settings.Default.EmotionAPIKey.Trim(); 
    Properties.Settings.Default.VisionAPIKey = Properties.Settings.Default.VisionAPIKey.Trim(); 

    // Create API clients. 
    _faceClient = new FaceServiceClient(Properties.Settings.Default.FaceAPIKey); 
    _emotionClient = new EmotionServiceClient(Properties.Settings.Default.EmotionAPIKey); 
    _visionClient = new VisionServiceClient(Properties.Settings.Default.VisionAPIKey); 

    // How often to analyze. 
    _grabber.TriggerAnalysisOnInterval(Properties.Settings.Default.AnalysisInterval); 

    // Reset message. 
    MessageArea.Text = ""; 

    // Record start time, for auto-stop 
    _startTime = DateTime.Now; 


    await _grabber.StartProcessingCameraAsync(CameraList.SelectedIndex); 
} 

private async void StartButton_Click(object sender, RoutedEventArgs e) 
{ 
    StartCamera(); 
} 

私はStartCamera方法がもともとありませんでしたが示唆されたとして、関数の非パラメータの使用を作成するために追加されたことを追加する必要があります。私は、例えば使用して、それを起動しようとすると、

私はいつもそれにInvalidOperationExceptionが出る:

StartButton.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent)); 

この例外の情報は次のとおりです。{ "別のスレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません"}

私はこの例外が本当にボタンを押しても問題ないのですが、なぜそれを呼び出すのか理解できないと思います。誰もが将来にintrestedている場合

Invoking an onclick on button threw code in a different thread in C#

編集2

ありがとう:

質問が続きます。

+3

あなたが実際にボタンが押される必要があります - またはあなただけのクリックイベント内のコードを実行する必要がありますか? – PaulF

+0

'StartButton_click(null、null)'を実行するタイマーを設定するのはなぜですか? – vipersassassin

+0

ちょうどコード、私はヘッダーのこの種のちょうど新しいと思う、もし私がnullを渡すなら、それはうまくいくはずですか? – NotSure

答えて

1

このメソッドを呼び出すのはどうですか?

StartButton_Click(this, new RoutedEventArgs()); 

また、あなたは、イベントハンドラとあなたのタイマーの両方から呼び出すパラメータを指定せずにメソッドを定義できます

private async void StartButton_Click(object sender, RoutedEventArgs e) 
{ 
    TheMethod(); 
} 

その後、あなたはパラメータを気にする必要はありません。

第三の選択肢は、プログラムでイベントを発生させることです。

button.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent)); 
+0

私は動的に実行するのではなく、実際にパラメータをクリックしたときに何が渡されるのか不明だと言ったので、これはうまくいくと思います。 – NotSure

+0

イベントハンドラでパラメータを使用しない場合は、任意の値を渡すことができます。 – mm8

+1

'async void'メソッドを呼び出すとバグが発生します。彼らは他の方法のように呼ばれることを意図したものではなく、待つことができず、その例外を捕らえることもできません。 OP shoudl * not *ボタンハンドラを呼び出そうとする –

関連する問題