我已经搜索了很多关于如何在if语句中调用控件一段时间并且无法在此找到任何内容的搜索。我确定我错过了一些东西,但是如果有人能告诉我如何做到这一点会很棒。这是我的一小段代码,可以让您了解我的问题所在。
if(cardPanelOpponent.GetChildAtPoint(new Point(i, x)) == null)
{
OpponentCard.Location = new Point(i, x);
cardPanelOpponent.Invoke(new Action(() => cardPanelOpponent.Controls.Add(OpponentCard))
break; }
这一行是在异步环境中进行的,所以我得到一个跨线程异常。如何在不同的线程上运行此if语句,然后是UI。
答案 0 :(得分:1)
如果您的代码在工作线程中运行,则不允许您拨打GetChildAtPoint
或在其中设置Location
。您需要将控件传递给UI线程。
if(cardPanelOpponent.InvokeRequired)
{
cardPanelOpponent.Invoke(new Action(() =>
{
if(cardPanelOpponent.GetChildAtPoint(new Point(i, x)) == null)
{
OpponentCard.Location = new Point(i, x);
cardPanelOpponent.Controls.Add(OpponentCard);
}
});
}
注意:上述代码中的语义已发生变化。我们不能在这里添加break语句。因此,您可能需要根据需要进行更正。