0

是否允许/不鼓励在 Windows 窗体应用程序中使用标签来显示应用程序状态?

起初我认为这将是一个明智的想法,但现在我意识到我有很多日志没有显示,如果我不对 Label.Text 更改进行尝试/捕获,经常会崩溃。这是我使用的功能。

private void Echo(string p)
{
    lock (m_syncObject)
    {
        try
        {
            InfoBox.Text = p.ToString();
        }
        catch { }
    }
}

如您所见,我还为对同一资源的多次访问添加了一个锁。谁能解释为什么我经常被“抓住”?

4

2 回答 2

3

InfoBox.Text = p.ToString(); -> 那会产生跨线程异常。试试这个:

delegate void myDelegate(ref Label lb, string toAdd);
private void UpdateLabel(ref Label lb, string toAdd)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new myDelegate(UpdateLabel), new object[] { lb, toAdd });
    }
    else
    {
        lb.Text = toAdd;
    }
}
于 2012-11-15T10:02:41.187 回答
1

您不必调用.ToString字符串类型变量。如果你的p为空,那么你会得到异常。你可以简单地做:

private void Echo(string p)
{
    lock (m_syncObject)
    {
        try
        {
            InfoBox.Text = p;
        }
        catch { }
    }
}
于 2012-11-15T09:55:38.337 回答