Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用匿名方法异步更新WinForms GUI_C#_Winforms - Fatal编程技术网

C# 使用匿名方法异步更新WinForms GUI

C# 使用匿名方法异步更新WinForms GUI,c#,winforms,C#,Winforms,我有一个Windows窗体应用程序,我正在尝试异步更新控件,这当然让我想到了这个问题: 在谷歌搜索了很多次,并且很难理解如何实现#1答案后,我转而使用第二个答案: 我的代码现在如下所示: private void showPicture(string name) { if (name == "") { if (!this.Created || (isNullOrEmpty(comboBoxRepresentative) && isNullOrEmp

我有一个Windows窗体应用程序,我正在尝试异步更新控件,这当然让我想到了这个问题:

在谷歌搜索了很多次,并且很难理解如何实现#1答案后,我转而使用第二个答案:

我的代码现在如下所示:

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)委托{pictureBox1.Load(url);})正在引发catch块未捕获的参数异常(
参数无效
)。为什么try{}catch{}不能捕获异常

为什么try{}catch{}不能捕获异常

因为它正在另一个线程中抛出。这就是
Invoke
所做的:它在另一个线程中执行代码。在此期间,当前线程阻塞。鉴于这两个线程是临时绑定在一起的,认为调用线程能够捕获异常并不疯狂,但对我来说它也不能捕获异常。这是经验性的;我可能会收到一条评论,说我对这里的“为什么”完全错了

下面是我如何重写的:

this.Invoke((MethodInvoker)delegate {
    try
    {
        labelNoImage.Hide();
        pictureBox1.Show();
        pictureBox1.Load(url);
    }
    catch (Exception ex)
    {
        pictureBox1.Hide();
        labelNoImage.Show();
    }
});
它也更具可读性

为什么try{}catch{}不能捕获异常

因为它正在另一个线程中抛出。这就是
Invoke
所做的:它在另一个线程中执行代码。在此期间,当前线程阻塞。鉴于这两个线程是临时绑定在一起的,认为调用线程能够捕获异常并不疯狂,但对我来说它也不能捕获异常。这是经验性的;我可能会收到一条评论,说我对这里的“为什么”完全错了

下面是我如何重写的:

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

它也更具可读性

啊,这是有道理的!而且,你是对的,这更具可读性。谢谢而且效率更高<代码>调用
的开销相对较高,因为它会导致线程切换……啊,这很有道理!而且,你是对的,这更具可读性。谢谢而且效率更高<代码>调用开销相对较高,因为它会导致线程切换。。。