###前提・実現したいこと
お世話になります。
今回スレッドの勉強でコードを書いていたのですが、コードの書き方でエラーが起きたり起きなかったりしてしまっているので原因を知りたく質問させていただきました。
フォームにテキストボックスを1つだけ置き下記のコードを記入します。
###該当のソースコード
C#
1namespace thread 2{ 3 public partial class Form1 : Form 4 { 5 private Thread test; 6 private string txt; 7 public Form1() 8 { 9 InitializeComponent(); 10 11 12 } 13 14 private void Form1_Load(object sender, EventArgs e) 15 { 16 17 test = new Thread(new ThreadStart(textchange)); 18 test.Start(); 19 20 } 21 22 public void textchange() 23 { 24 txt="実行終了"; 25 textBox1.Text = txt; 26 27 28 } 29 } 30} 31上記のコードだとアイテムにアクセスできずエラーが起きるのはわかるのですが 32 33namespace thread 34{ 35 public partial class Form1 : Form 36 { 37 private Thread test; 38 private string txt; 39 public Form1() 40 { 41 InitializeComponent(); 42 test = new Thread(new ThreadStart(textchange)); 43 test.Start(); 44 45 } 46 47 public void textchange() 48 { 49 txt="実行終了"; 50 textBox1.Text = txt; 51 52 53 } 54 } 55} 56 57これで実行すると動いてしまいます。
なぜコンストラクタでスレッドを実行させると正常終了してしまうのでしょうか?
ご教授よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
VisualStudio2013
エラー(例外)の内容(メッセージ)をご提供いただけますか?「>上記のコードだとアイテムにアクセスできずエラーが起きるのはわかるのですが」とありますが、UIスレッドを別のスレッドから操作しようとしたための例外なようにも思えますので、何の例外かでそこをはっきりできます。
例外内容はこちらです。型 'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました 追加情報:有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox1' がアクセスされました。
回答3件
あなたの回答
tips
プレビュー