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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ありちゃん
記事: 10
登録日時: 7年前

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

#1

投稿記事 by ありちゃん » 7年前

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) で終了しました。

です。
たぶん単純なことと思いますが、教えて下さい。
どうぞよろしくお願いいたします。
添付ファイル
コード相談.txt
(2.73 KiB) ダウンロード数: 39 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 7年前

なんか仕事用ぽいのですが公開される掲示板に貼り付けて大丈夫ですか?
前に守秘義務違反で削除することになった例もあるのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

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

#3

投稿記事 by YuO » 7年前

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

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

ありちゃん
記事: 10
登録日時: 7年前

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

#4

投稿記事 by ありちゃん » 7年前

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

ありちゃん
記事: 10
登録日時: 7年前

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

#5

投稿記事 by ありちゃん » 7年前

>>[FileSystemWatcher.SynchronizingObject プロパティ 使って楽をすることも出来ます。[/quote]

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

ありちゃん
記事: 10
登録日時: 7年前

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

#6

投稿記事 by ありちゃん » 7年前

watcher.SynchronizingObject = this;
の追加で楽が出来ました。
ありがとうございます。

ありちゃん
記事: 10
登録日時: 7年前

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

#7

投稿記事 by ありちゃん » 7年前

解決しました。
詳細の理解は出来ませんでしたが・・・・。
シンクロナイズオブジェについて、簡単に教えていただければ幸いです。
皆様方、ありがとうございました。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

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

#8

投稿記事 by YuO » 7年前

ありちゃん さんが書きました:詳細の理解は出来ませんでしたが・・・・。
シンクロナイズオブジェについて、簡単に教えていただければ幸いです。
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。

閉鎖

“C言語何でも質問掲示板” へ戻る