2016-08-30 7 views
0

でのWinForms GUI非同期の更新Iは、Windowsフォームアプリケーションを、私はこれ、asynchrnoouslyコントロールを更新しようとしているんだ - この質問に私を導いた - もちろん:多くの理解をグーグルで、トラブルの後How to update the GUI from another thread in C#?匿名メソッド

#1の回答を実装する方法を、私の代わりに第二の答えになって:https://stackoverflow.com/a/661662/2246411

私のコードは次のようになります。

private void showPicture(string name) 
{ 
    if (name == "") 
    { 
     if (!this.Created || (isNullOrEmpty(comboBoxRepresentative) && isNullOrEmpty(comboBoxState))) 
      return; 
     else 
     { 
      this.Invoke((MethodInvoker)delegate { pictureBox1.Hide(); }); 
      this.Invoke((MethodInvoker)delegate { labelNoImage.Show(); }); 
     } 
    } 

    string url = "http://info.sigmatek.net/downloads/SalesMap/" + name; 

    try 
    { 
     this.Invoke((MethodInvoker)delegate { labelNoImage.Hide(); }); 
     this.Invoke((MethodInvoker)delegate { pictureBox1.Show(); }); 
     this.Invoke((MethodInvoker)delegate { pictureBox1.Load(url); }); 
    } 
    catch 
    { 
     this.Invoke((MethodInvoker)delegate { pictureBox1.Hide(); }); 
     this.Invoke((MethodInvoker)delegate { labelNoImage.Show(); }); 
    } 
} 

this.Invoke((MethodInvoker)delegate { pictureBox1.Load(url); });は(引数の例外を投げています)は、キャッチブロックがキャッチしていないことを示します。 try {} catch {}が例外をキャッチしないのはなぜですか?

答えて

2

try {} catch {}が例外をキャッチしないのはなぜですか?

これは別のスレッドでスローされているためです。これは、Invokeのことです:別のスレッドでコードを実行します。現在発生している間、現在のスレッドはブロックします。 2つのスレッドが同じように一緒に一時的にヨークされていることを考えると、呼び出すスレッドが例外をキャッチできると考えるのは夢中ではありませんが、私にとってもそれをキャッチしません。これは経験的なものです。私は「なぜ」ここで「私は間違って死んでいる」というコメントを得るかもしれません。ここで

は、私はそれを書き換えたい方法は次のとおりです。

this.Invoke((MethodInvoker)delegate { 
    try 
    { 
     labelNoImage.Hide(); 
     pictureBox1.Show(); 
     pictureBox1.Load(url); 
    } 
    catch (Exception ex) 
    { 
     pictureBox1.Hide(); 
     labelNoImage.Show(); 
    } 
}); 

それはあまりにも、より読みやすいです。

+0

ああ、それは理にかなっています!そして、あなたは正しい、それははるかに読みやすいです。ありがとう! – derekantrican

+0

さらに効率的です。 'Invoke'はスレッドスイッチの原因となる比較的高いオーバーヘッドを持っています... – Phil1970