Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#-在不同线程中添加UserControl会导致异常,即使在调用_C#_Multithreading_Winforms_User Controls - Fatal编程技术网

C#-在不同线程中添加UserControl会导致异常,即使在调用

C#-在不同线程中添加UserControl会导致异常,即使在调用,c#,multithreading,winforms,user-controls,C#,Multithreading,Winforms,User Controls,我在winfroms中构建了一个自定义UserControl,并通过辅助线程将其添加到面板中 我知道,当通过辅助线程添加控件时,需要调用主线程来完成。所以我做了。。但我仍然收到一个异常,它说“跨线程操作无效:控件'pictureBoxImage'是从创建它的线程以外的线程访问的。” 我被卡住了,不知道是什么原因导致了这种情况,因为我试图通过在每个自定义UserControl方法上放置断点来调试它,但它们中的任何一个都不会引发异常 private void addControl(Control i

我在winfroms中构建了一个自定义UserControl,并通过辅助线程将其添加到面板中

我知道,当通过辅助线程添加控件时,需要调用主线程来完成。所以我做了。。但我仍然收到一个异常,它说“跨线程操作无效:控件'pictureBoxImage'是从创建它的线程以外的线程访问的。”

我被卡住了,不知道是什么原因导致了这种情况,因为我试图通过在每个自定义UserControl方法上放置断点来调试它,但它们中的任何一个都不会引发异常

private void addControl(Control i_ControllToAdd, Control i_ParentControl)
    {
        if (i_ParentControl.InvokeRequired)
        {
            i_ParentControl.Invoke(new Action(() => addControl(i_ControllToAdd, i_ParentControl)));
            return;
        }

        i_ParentControl.Controls.Add(i_ControllToAdd);
    }
这是自定义UserControl类

public partial class FBPostUserControl : UserControl
    {
        private readonly string m_UserName = string.Empty;
        private readonly Image m_UserProfileImage = null;
        private readonly DateTime? m_DatePosted = null;
        private Image m_Image = null;
        private string m_PostBody = string.Empty;

    public string UserName
    {
        get { return m_UserName; }
    }

    public DateTime? DatePosted
    {
        get { return m_DatePosted; }
    }

    public Image Image
    {
        get { return m_Image; }
        set
        {
            if (value == null)
            {
                pictureBoxImage.Visible = false;
            }
            else
            {
                pictureBoxImage.Visible = true;
                pictureBoxImage.Image = value;
                updateImageSize();
            }
        }
    }

    private void updateImageSize()
    {
        if (pictureBoxImage.Image != null)
        {
            double ratio = pictureBoxImage.Image.Width / pictureBoxImage.Image.Height;
            pictureBoxImage.Height = (int)(pictureBoxImage.Width / ratio);
            pictureBoxImage.SizeMode = PictureBoxSizeMode.Zoom;
        }
    }

    public string PostBody
    {
        get { return m_PostBody; }
        set
        {
            if (string.IsNullOrWhiteSpace(value) == false)
            {
                labelPostBody.Visible = true;
                labelPostBody.Text = value;
            }
            else
            {
                labelPostBody.Visible = false;
            }
        }
    }

    public Image UserProfileImage
    {
        get { return m_UserProfileImage; }
    }

    public FBPostUserControl(string i_Name, Image i_ProfileImage, DateTime? i_PostDate)
    {
        InitializeComponent();
        m_UserName = i_Name;
        m_UserProfileImage = i_ProfileImage;
        m_DatePosted = i_PostDate;

        refreshHeader();
    }

    private void refreshHeader()
    {
        pictureBoxUserImage.Image = m_UserProfileImage;
        labelName.Text = m_UserName;

        if (labelDate != null)
        {
            labelDate.Text = m_DatePosted.ToString();
        }
        else
        {
            labelDate.Visible = false;
        }
    }
}

任何控件都应该在UI线程上创建,也可以从同一线程访问。

它之所以给您异常,是因为您正在一个线程(您的辅助线程)上创建
控件以添加
,并使用Invoke语句将其添加到另一个线程(您的UI线程)上的UI

要消除这种情况,请确保在一个线程上创建控件,并在创建控件的同一线程上访问它

下面的片段可能不是你想要的,但它只是给你一个想法

i_ParentControl.Invoke(new Action(() => addControl(new Control(), i_ParentControl)));