2017-04-03 5 views
0

私はシングルスレッドプログラム(リサイズMEH)を書いて、それがこのように振る舞うことを期待しています:バックグラウンドワーカーなしでUIが時間通りに更新されないのはなぜですか?

  1. のMainFormを進捗表示形式
  2. 進捗フォームが追加されますoperationStarted完全
  3. 進捗フォームreceievesイベントをレンダリングされます開始します
  4. 長時間動作開始
  5. 進行状況は、イベントoperationCompletedまたはoperationFailedを受け取り、適切なイメージを設定します。

何が起こるのは面倒です。

  1. のMainFormを進捗表示形式
  2. が進捗フォームが完全にレンダリングされていません開始します!
  3. プログラムは、長期的な操作が完了したUIの更新

である場合にはしばらく

  • でハングなぜWindowsフォームを更新して遅れ?

    これは

    private bool Run(int commandIndex, string fullCommand) 
        { 
         if (operationStarted != null) 
          operationStarted(commandIndex); 
    
         // start long lasting external process 
    
         if (exitCode != 0) 
         { 
          if (operationFailed != null) 
           operationFailed(commandIndex, Error); 
    
          return false; 
         } 
    
         if (operationCompleted != null) 
          operationCompleted(commandIndex); 
    
         return true; 
        } 
    

    operationStarted必要に応じて、コードを低下& operationCompletedをOperationFailedがされているが、適切な画像を更新するように正しく設定されています。

  • +1

    BackGroundWorkerが必要です。_long lasting_操作がUIと同じスレッドで実行されているため、UIがリフレッシュされないようにスレッドがブロックされます。 – Pikoh

    +0

    問題は、プログラムが次々と動作するため、進行状況表示を開始し、その後もそのレンダリングによって長続きする操作が開始され、操作が中断されます。この操作が完了すると、UIを表示し続けます。あなたは別のスレッドでこれを行うBackgroundworkerをネーミングします –

    答えて

    2

    これは大幅に簡素化されていますが、これで十分だと思います。

    Windowsは、キューシステムで処理されるメッセージによって駆動されます。

    ウィンドウを表示すると、1つ以上のメッセージがキューに入れられ、処理される必要があります。

    これらのメッセージの1つは、ペイントメッセージになります。このメッセージに応答して、プログラムは画面上にウィンドウ(またはその内部のもの)をペイントすることになっています。

    キューシステムが処理される方法は、フォームが連続のようなものをやっているスレッドによって所有されていることである:取り扱うこのループは、そのユーザプログラムを指示するメッセージだったメッセージの

    while (true) 
    { 
        var message = GetNextMessage(); 
        if (message == none) break; 
        ProcessMessage(message); 
    } 
    

    ワンボタンをクリックするとフォームが表示されます。

    これに応答して、.NETはこのメッセージをイベントハンドラにイベントとしてルーティングします。通常は "button1_Click"のように実行されます。

    イベントハンドラまで、このクリックメソッドが返すまで、このループはどのメッセージも処理していません。

    このように、ボタンのクリックイベントが何か長いことをしていると、「UIをブロックしている」と言われています。これは基本的に「整然とした方法でメッセージループに戻っていません」。

    関連する問題