C# 无法访问非静态字段';lblSystemStatus';在静态上下文中

C# 无法访问非静态字段';lblSystemStatus';在静态上下文中,c#,multithreading,winforms,user-controls,C#,Multithreading,Winforms,User Controls,我看到过很多关于这个问题的帖子,但没有一篇有帮助。 我有以下简单代码: private delegate void UpdateLabelCallback(Label lbLabel, string val); 防止非法跨线程调用的简单委托 private static readonly System.Threading.Timer TimerHalfASecond = new System.Threading.Timer(HalfASecondCallback, null,

我看到过很多关于这个问题的帖子,但没有一篇有帮助。 我有以下简单代码:

private delegate void UpdateLabelCallback(Label lbLabel, string val);
防止非法跨线程调用的简单委托

private static readonly System.Threading.Timer TimerHalfASecond = new System.Threading.Timer(HalfASecondCallback, null,
        500, Timeout.Infinite);
线程计时器

private static void HalfASecondCallback(object state)
{
    UpdateLabel(lblSystemStatus, Resources.DesktopClock_timerOneSecond_Tick_CPU__ + _cpu.GetCpuCounter().ToString() + @"%");
    TimerHalfASecond.Change(500, Timeout.Infinite);
}
静态
Threading.Timer
回调。
lblSystemStatus
显示错误

“无法在静态上下文中访问非静态字段'lblSystemStatus'”

静态UpdateLabel方法

所以问题是:
当控件上的标签不是静态的且回调要求它们是静态的时,我如何更新它们?

您将计时器声明为
专用静态只读。如果计时器在类(控件)的实例中运行,我不会这样做。如果不将其设置为静态,则其他方法不必设置为静态,并且可以安全地使用实例变量(如果有两个类实例,则计时器可能会冲突)


另一种方法是将
状态
提供给
计时器
构造函数以包含标签,或者提供一个
Func您可以创建一些静态字段,将标签分配给此字段并在静态上下文中使用它

刚刚尝试过-它不需要标签l的实例化,回调方法不再需要静态属性。好的,这也是一个解决方案:)
private static void UpdateLabel(Label lbLabel, string val)
{
    if (lbLabel.InvokeRequired)
    {
        var d = new UpdateLabelCallback(UpdateLabel);
        lbLabel.Invoke(d, lbLabel, val);
    }
    else
    {

        lbLabel.Text = val;
    }
}
new System.Threading.Timer(HalfASecondCallback, this.lblStatusText,
    500, Timeout.Infinite);
private static void HalfASecondCallback(object state)
{
    Label l = state as Label; // in fact lblSystemStatus

    if (l != null)
    {
        UpdateLabel(l, Resources.DesktopClock_timerOneSecond_Tick_CPU__ + _cpu.GetCpuCounter().ToString() + @"%");
        TimerHalfASecond.Change(500, Timeout.Infinite);
    }
}