2009-06-18 25 views
0

私はWndows XP SP3 x86 + VSTS 2008を使用して、C#を使用して簡単なWindowsフォームアプリケーションを作成しています。 button1と呼ばれるボタンがあります。ここにclickイベントのイベントハンドラがあります。ifステートメントを実行すると、Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingExceptionがあります。誰にも間違っているアイデアはありますか?WinFormsアプリケーションのデバッグ中にCrossThreadMessagingExceptionを受け取る

private void button1_Click(object sender, EventArgs e) 
{ 
    string recording = ConfigurationSettings.AppSettings["recording"]; 

    // exception thrown when executing the following if statement 
    if (recording.Equals("enable", StringComparison.InvariantCultureIgnoreCase)) 
    { 
     CameraEncoder.Stop(); 
    } 
} 

いくつかのより多くのコード:

static WMEncoder CameraEncoder = new WMEncoder(); 

EDIT1:

私は私のコードでInvokeを使用してのマークの考え方を適用するかどうかは混乱しています。次のコードセグメントを使用する必要がありますか?

CameraEncoder.Invoke((MethodInvoker) delegate 
{ 
     CameraEncoder.Stop(); 
}); 
+1

(コメントに返信) –

+0

私はあなたの素晴らしいコメントを見た、私は私を追加しました。あなたの素晴らしいアイデアを再検討して共有してください。 :-) – George2

答えて

3

通常、我々はこれを見る問題は(定期的)ワーカースレッドまたはUIを更新するタイマーのようなものである - しかし、ボタンのクリックは、UIスレッドにより調達しなければならないので、私はそれを考えていません「通常の問題」です。

だから:cameraとは何ですか? Recordingとは何ですか?どちらの場合について説明し、我々は...多分これがうまくいく、彼らが何であるかに応じて...余分な変数を導入することなく

camera.Invoke((MethodInvoker) delegate 
{ 
    if (camera.Equals("enable", StringComparison.InvariantCultureIgnoreCase)) 
    { 
     Recording.Stop(); 
    }   
}); 

しかしcaneraが何であるかを知らずに

を推測することはできません私はストローで握っています...

+0

ありがとうMarc! 1.タイプミスやカメラオブジェクトがなく、文字列としてのオブジェクトだけが記録されます。私の悪い。 :-) 2. CameraEncoderは、Form Loadメソッドで起動するWindows Media Encoderオブジェクトですが、if文を実行するとCameraEncoder.Stopをまだ実行していないので、そのような例外があるためCameraEncoderの問題ではないと思います。さらに分析するための任意のアイデア? 3.私はWindows VistaとWindows Server 2003で、私のコードは正常に動作し、Windows XPには問題があることがわかりました。 – George2

+0

"MethodInvoker"とは何ですか? C#で "MethodInvoker"というキーワードや関数が見つかりませんでしたか? – George2

+1

MethodInvokerはSystem.Windows.Formsのデリゲート型です。単純にvoidを返し、パラメータを受け入れません。 –

1

多分、カメラオブジェクトは別のスレッドによって作成され、管理されています。カメラオブジェクトに関するより多くのコードを公開できますか?

+0

申し訳ありませんが、私のタイプミス、カメラオブジェクトはありません、文字列としてオブジェクトをレコーディングするだけです。 – George2

1

私が知っているWMEncoderCOMオブジェクトです。別のスレッドではなくGUIスレッドでCameraEncoderを作成してみてください。

+0

私はそれを静的オブジェクトとして宣言します。したがって、どのスレッドが静的オブジェクト、メインGUIスレッドを作成しますか?それを証明する方法? – George2

+0

私はそれを静的オブジェクトとして宣言します - 私はそれをフォームクラスの静的オブジェクトとして宣言します。 – George2

+0

"別のスレッドではなく、GUIスレッドでCameraEncoderを作成してみてください。 - はい、何が間違っていますか? – George2

関連する問題