【问题标题】:Use a other Method in a static method在静态方法中使用其他方法
【发布时间】:2013-03-07 09:31:55
【问题描述】:

如何在我的静态方法timer_Elapsed 中使用方法ChangeText

public Load()
{
    InitializeComponent();

    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = 1000;

    // I can't transfer parameters here
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
    timer.Start();
}

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //Its underlined in red. I need a object reference?
    ChangeText(); 
}

public void ChangeText()
{
    label1.Text = label1.Text + ".";
}

【问题讨论】:

  • 删除 timer_Elapsed 方法上的静态?
  • 为什么 timer_Elapsed 是静态的?

标签: c# timer elapsed


【解决方案1】:

我看不出timer_Elapsed 应该是static 的任何理由。因此,只需将其删除。

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    ChangeText(); //Its not underlined anymore, you have an object reference
}

另一种方法是将ChangeText 设为静态。但这行不通,因为您想设置 Label 的文本,因此无论如何您都需要 Form 的实例。

【讨论】:

    【解决方案2】:

    首先,您的方法 (timer_Elapsed) 不能让我保持静态,以便使用实例属性 (label1)

    您的代码中还有一个问题:Timer创建了另一个线程,大多数Windows控件属性只能由UI线程修改。您的代码将引发 CrossThreadException。 为了解决您的问题,您应该使用以下代码修改您的代码:

    if(this.InvokeRequired) {
       BeginInvoke(
           new MethodInvoker(delegate { label.Text+="."; }));
    } else {
        label.Text+="."; 
    }
    

    问候

    【讨论】:

    • 哦,好地方——不过,更简单的解决方法是使用System.Windows.Forms.Timer(因为示例看起来像winforms),它会自动回调正确的线程
    • 为此! (这是一个 InvalidOperationException)
    【解决方案3】:

    将 ChangeText 设为静态方法。

    public static void ChangeText()
    

    【讨论】:

    • ChangeText 清楚地与实例状态对话;更好的解决方案是使timer_Elapsed 方法非静态
    【解决方案4】:

    静态方法只调用静态方法, 要么将 ChangeText() 方法设为静态,要么将 time_Elapsed 方法设为非静态

    【讨论】:

    • ElapsedEventHandler 需要一个静态方法,所以我无法更改它。来自标签的文本在 ChangeText 方法中更改,当我将其设为静态时,我无法访问标签
    【解决方案5】:

    如果不先创建实例,就不能在静态方法中调用实例方法。您必须创建此方法所属的类的实例。如下:

    var instance = new Load();
    instance.ChangeText();  
    

    更新: 正如其他答案所建议的那样,您应该重新考虑将timer_Elapsed 定义为静态。

    【讨论】:

    • 由于计时器是由Load 构造函数启动的,这将是一个非常糟糕的主意;你想要几个?
    • @MarcGravell 我知道这不是一个好主意。只是简单地回答了 OP 的问题并用警告更新了我的答案。
    【解决方案6】:

    你好,你可以试试如下:

    public Load()
    {
        InitializeComponent();
    
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Interval = 1000;
    
        // I can't transfer parameters here
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
        timer.Start();
    }
     private delegate void ChangeLabel();
            private void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                var ChangeLabel = new ChangeLabel(ChangeText);
                this.BeginInvoke(ChangeLabel);
    
            }
            private void ChangeText()
            {
                label1.Text = label1.Text + ".";
            }
    

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2018-04-18
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多