48756


C#でフォームボタンがクリックして条件がととのうまで処理をすすめたくないのですが、whileを使用するとフォームが固まってしまいます。いろいろネットで調べたのですがまだ解決していません。下記にコードを示します。

[code]

    public partial class Form1 : Form
        {
    public int count{get; set;} = 0;
    public List<int> list = new List<int>{1,2,3,4};
    
    private void start_Click(object sender, EventArgs e){
        if(this.count == this.list.Count){
    //this.countが4になるまで処理をすすめたくない
    }
    }
    
    //this.countのインクリメントはボタンで行いたい。
    private void button2_Click(object sender, EventArgs e){
        this.count += 1;
    }
    
    }
    
[/code]

whileを使って条件がそろうまでループしてやればいいと思っていたのですが、whileを使うと固まってしまいます。なにか解決方法はありますでしょうか？


CC BY-SA 4.0
2018-09-26T10:38:28.757
48726
2018-09-27T04:56:53.583
2018-09-26T11:25:37.607
26076
26076
question
c#
C#でフォームボタンクリックし条件がそろうまでコードをすすめたくない。


## 自己解決しました

[code]

    while(true){
    if(this.count == 4){
        break;
    }
    Application.DoEvent();
    }
    
[/code]

while構文に
Application.DoEvent()メソッドを使用することでフォームが固まらなくなるようです。詳しい仕組みはあまり理解できていませんが、以下のサイトが参考になりました。

[時間がかかる処理での「応答なし」を回避するには？](http://www.atmarkit.co.jp/ait/articles/0403/19/news088.html)


CC BY-SA 4.0
2018-09-26T14:51:19.790
48738
2018-09-26T14:51:19.790
26076
48726
answer


オイラ的には `DoEvent` を使ったら負けだと思っているので別の解決策を

要するに `this.count==4` となれば `start_Click` できるようになれば良いわけです。ということは `start`
(ボタンですよね？) の `Enabled` を操作すればよくて、例えば

  * `Form_Load` やデザイナなどで `start.Enabled=false;` にして `start` を押せない状況で起動する
  * `button2_Click` 中で `start.Enabled = (count == list.Count);` などとし、適切なタイミングで `start` を押せるようにする
  * `start_Click` では処理するだけでよい（条件成立まで押せないため）

WinForm App であれ WPF App であれ、イベントハンドラの中で待つようなコードは書かないよう今から心がけてください。 UWP App
ではそもそも待ってはいけないことになっています。

`DoEvent` は弊害が大きすぎてオイラは一度も実用したことないです。ダメ。ゼッタイ。


CC BY-SA 4.0
2018-09-27T04:56:53.583
48756
2018-09-27T04:56:53.583
8589
48726
answer