ページ 11

C#の実行エラーについて

Posted: 2013年1月21日(月) 17:21
by ありちゃん
C#の基本について教えて下さい。
添付にコードテキストを付けました。
 
問題は、
internal void DoWork(object source, FileSystemEventArgs e)
{
MessageBox.Show("Do Work実行 ");

//label1.Text = "アイウエオ";//textBox1
label1.Text = "アイウエオ";//textBox1
  
このlabel1.Textが実行エラーになります。

コンソール出力は、下記の通りです。
'放射線科チェックシステム30.vshost.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\System.Windows.Forms.resources.dll' が読み込まれました
'System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。
'放射線科チェックシステム30.vshost.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll' が読み込まれました
プログラム '[2672] 放射線科チェックシステム30.vshost.exe: マネージ (v4.0.30319)' はコード 0 (0x0) で終了しました。

です。
たぶん単純なことと思いますが、教えて下さい。
どうぞよろしくお願いいたします。

Re: C#の実行エラーについて

Posted: 2013年1月21日(月) 17:29
by softya(ソフト屋)
なんか仕事用ぽいのですが公開される掲示板に貼り付けて大丈夫ですか?
前に守秘義務違反で削除することになった例もあるのですが。

Re: C#の実行エラーについて

Posted: 2013年1月21日(月) 17:51
by YuO
実行エラーって,例外の発生のことでしょうか。
そうであれば,ちゃんと例外の情報を提示すべきです。
例外処理アシスタントで例外情報をクリップボードにコピーできるはずです (VS2005以降)。

でもって,ざっと見た感じでは,基本的なクロススレッドアクセス例外のようですが。
基本的にはFormのInvokeBeginInvoke/EndInvokeによるアクセスが必要ですが,
FileSystemWatcher.SynchronizingObject プロパティ 使って楽をすることも出来ます。

Re: C#の実行エラーについて

Posted: 2013年1月21日(月) 18:48
by ありちゃん
>>
softya(ソフト屋) さんが書きました:なんか仕事用ぽいのですが公開される掲示板に貼り付けて大丈夫ですか?
>>前に守秘義務違反で削除することになった例もあるのですが。
返信ありがとうございます。
仕事に生かそうと、素人勉強中です。
 
システムの名前やコードに不適切な所があり反省しているしだいです。
コード自体は、こんなこと出来るのかな・・・と遊び半分ですが、・・・・悩み多きです。
 
色々ご指導の程、お願いいたします。

Re: C#の実行エラーについて

Posted: 2013年1月21日(月) 19:46
by ありちゃん
>>[FileSystemWatcher.SynchronizingObject プロパティ 使って楽をすることも出来ます。[/quote]

回答ありがとうございます。
楽をする方法を教えてください。
「FileSystemWatcher.SynchronizingObject プロパティ」を見てもピンと来ません。
 
素人相手でもどかしいと思いますが、よろしくお願いいたします。

Re: C#の実行エラーについて

Posted: 2013年1月21日(月) 21:29
by ありちゃん
watcher.SynchronizingObject = this;
の追加で楽が出来ました。
ありがとうございます。

Re: C#の実行エラーについて

Posted: 2013年1月22日(火) 11:34
by ありちゃん
解決しました。
詳細の理解は出来ませんでしたが・・・・。
シンクロナイズオブジェについて、簡単に教えていただければ幸いです。
皆様方、ありがとうございました。

Re: C#の実行エラーについて

Posted: 2013年1月22日(火) 13:55
by YuO
ありちゃん さんが書きました:詳細の理解は出来ませんでしたが・・・・。
シンクロナイズオブジェについて、簡単に教えていただければ幸いです。
FileSystemWatcherでは,SynchronizingObjectプロパティで楽ができる,というだけであって,Invokeの呼び出しの方が「本来」の解決方法です。
おそらく,内部ではInvokeを呼び出すような実装になっているのだと思います。

Invokeの使い方は,擬似的に書くなら

コード:

void callback_method () // UIスレッド上で実行したいメソッド
{
    Text = "a";
}

void thread_method () // 非同期実行されているメソッド
{
    if (InvokeRequired)
    {
        Invoke((Action)callback_method);
    }
    else
    {
        callback_method();
    }
}
というような使い方をします。
UI部品には,UIスレッドからしか触れない,という原則があるので,Invokeを使ってUIスレッド上でデリゲートを実行させることになります。


なお,.NET Framework 2.0以降では,非同期操作のUIスレッドにおけるコールバックには,通常SynchronizationContextを利用して処理を行います。
BackgroundWorkerが典型例ですが,他にもWebClientの~Async系メソッドのコールバックもSynchronizationContextベースです。
.NET Framework 4.5/C# 5.0からはTaskをベースとしたAsyncパターンが実装され,通常の非同期操作はコンパイラの裏側に隠蔽することができるようになってきていますが,これもSynchronizationContextベースです。
# WinForms/WPF/ASP.NETなど,UIに関係なく統一的にコールバックできるのがSynchronizationContext。