2009-08-30 11 views
6

指定したフォルダの変更を検索し、詳細をtxtファイルに記録するファイルウォッチャーWindowsアプリケーションを作成しています。クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール

私は自分のアプリケーションからF5をヒットし、それが下記のエラーがスローされ注目されているフォルダ内のファイルを作成または変更する場合 http://www.codeproject.com/KB/dotnet/folderwatcher.aspx

下に、この資料に記載されているまさに続きます。

有効ではありません

クロススレッド操作を助けてください:コントロール「txtFolderActivity」は上に作成されたスレッド以外のスレッドからアクセス。

答えて

9

フォームでInvokeメソッドを使用する必要があります。イベントへの反応を変更するために匿名の代理人と話し合っています。

イベントハンドラは別のスレッドで発生します。この2番目のスレッドはフォームのコントロールにアクセスできません。スレッドを最初に作成したすべての制御作業を実行させるには、それらを「呼び出す」必要があります。代わりの

:あなたは非UIスレッドからUIを更新しようとしている

myForm.Invoke(new Action(
delegate() 
{ 
    myForm.Control1.Text = "newText"; 
})); 
+0

1 - それは私の現在のアプローチよりもかなり単純であるように私は、この問題を解決するためのあなたの方法を試してみる必要があります。 –

+0

+1ありがとう@Mischa。私の仕事はとても簡単でした。 :) – IsmailS

3

myForm.Control1.Text = "newText"; 

次のように記述する必要があります。 UIはスレッドアフィニティを持ち、作成したスレッドからしか更新できません。 WinFormsを使用している場合は、How to: make thread-safe calls to Windows Forms Controls MSDNの記事をご覧ください。基本的にはControl.Invokeメソッドを使用してUIを更新する必要があります。 WPFの場合は、DispatcherObjectを使用する必要があります。

1

基本的には、少なくとも2つのスレッドがアプリケーション内にある必要があります。また、コントロールロジックがオンになっているスレッドが異なるため、コントロールがスレッドセーフではないため、このエラーが発生します。

これは、複数のスレッドが同じコントロールを同時に変更することによって発生する可能性のある問題からユーザーを保護するためのものです。

あなたはここで見ることで、かなり詳細を見つけることができます。 http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx

関連する問題