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) で終了しました。
です。
たぶん単純なことと思いますが、教えて下さい。
どうぞよろしくお願いいたします。
C#の実行エラーについて
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: C#の実行エラーについて
なんか仕事用ぽいのですが公開される掲示板に貼り付けて大丈夫ですか?
前に守秘義務違反で削除することになった例もあるのですが。
前に守秘義務違反で削除することになった例もあるのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C#の実行エラーについて
実行エラーって,例外の発生のことでしょうか。
そうであれば,ちゃんと例外の情報を提示すべきです。
例外処理アシスタントで例外情報をクリップボードにコピーできるはずです (VS2005以降)。
でもって,ざっと見た感じでは,基本的なクロススレッドアクセス例外のようですが。
基本的にはFormのInvokeやBeginInvoke/EndInvokeによるアクセスが必要ですが,
FileSystemWatcher.SynchronizingObject プロパティ 使って楽をすることも出来ます。
そうであれば,ちゃんと例外の情報を提示すべきです。
例外処理アシスタントで例外情報をクリップボードにコピーできるはずです (VS2005以降)。
でもって,ざっと見た感じでは,基本的なクロススレッドアクセス例外のようですが。
基本的にはFormのInvokeやBeginInvoke/EndInvokeによるアクセスが必要ですが,
FileSystemWatcher.SynchronizingObject プロパティ 使って楽をすることも出来ます。
Re: C#の実行エラーについて
>>
仕事に生かそうと、素人勉強中です。
システムの名前やコードに不適切な所があり反省しているしだいです。
コード自体は、こんなこと出来るのかな・・・と遊び半分ですが、・・・・悩み多きです。
色々ご指導の程、お願いいたします。
返信ありがとうございます。softya(ソフト屋) さんが書きました:なんか仕事用ぽいのですが公開される掲示板に貼り付けて大丈夫ですか?
>>前に守秘義務違反で削除することになった例もあるのですが。
仕事に生かそうと、素人勉強中です。
システムの名前やコードに不適切な所があり反省しているしだいです。
コード自体は、こんなこと出来るのかな・・・と遊び半分ですが、・・・・悩み多きです。
色々ご指導の程、お願いいたします。
Re: C#の実行エラーについて
>>[FileSystemWatcher.SynchronizingObject プロパティ 使って楽をすることも出来ます。[/quote]
回答ありがとうございます。
楽をする方法を教えてください。
「FileSystemWatcher.SynchronizingObject プロパティ」を見てもピンと来ません。
素人相手でもどかしいと思いますが、よろしくお願いいたします。
回答ありがとうございます。
楽をする方法を教えてください。
「FileSystemWatcher.SynchronizingObject プロパティ」を見てもピンと来ません。
素人相手でもどかしいと思いますが、よろしくお願いいたします。
Re: C#の実行エラーについて
watcher.SynchronizingObject = this;
の追加で楽が出来ました。
ありがとうございます。
の追加で楽が出来ました。
ありがとうございます。
Re: C#の実行エラーについて
解決しました。
詳細の理解は出来ませんでしたが・・・・。
シンクロナイズオブジェについて、簡単に教えていただければ幸いです。
皆様方、ありがとうございました。
詳細の理解は出来ませんでしたが・・・・。
シンクロナイズオブジェについて、簡単に教えていただければ幸いです。
皆様方、ありがとうございました。
Re: C#の実行エラーについて
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。