【发布时间】:2020-12-01 18:17:50
【问题描述】:
我正在尝试在辅助线程上添加自定义控件,但是当我在线程仍在运行时关闭窗口时出现此异常:
在窗口之前不能在控件上调用 Invoke 或 BeginInvoke 句柄已创建。
我不知道得到这个异常的原因是因为一个误用的线程还是因为我在线程仍在运行时关闭了窗口。
这是我得到异常的代码:
panelWall.Invoke(new Action(() =>
{
postControl = new FBPostUserControl(m_LoggedInUser.Name, m_LoggedInUser.ImageNormal, post.CreatedTime);
postControl.PostBody = post.Message;
postControl.Image = postImage;
postControl.Dock = DockStyle.Top;
postControl.BringToFront();
}));
这是我的自定义控件的代码:
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;
}
}
}
【问题讨论】:
-
90% 肯定是因为“我正在关闭窗口,而线程仍在运行。”
-
我在尝试关闭带有活动线程的窗口时遇到了该错误。我最终使用了外行的测试 (if(this.FormClosing)return; 但我确信那里有更优雅的解决方案。
-
您的线程继续使用该控件,即使它不再存在。当然是卡布姆。在您允许窗口关闭之前,您可以确保线程停止。 stackoverflow.com/a/1732361/17034
标签: c# multithreading winforms