在静态方法中使用其他方法

本文关键字:其他 方法 静态方法 | 更新日期: 2023-09-27 18:02:37

如何在静态方法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应该是static的任何理由。所以直接把它删掉。

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

另一种方法是将ChangeText设置为静态。但这将不起作用,因为你想设置一个Label的文本,所以你需要一个Form的实例。

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

在你的代码中还有一个问题:定时器创建了一个其他线程,大多数windows控件属性只能通过UI线程修改。你的代码会抛出一个CrossThreadException。为了解决您的问题,您应该这样修改代码:

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

将ChangeText设置为静态方法

public static void ChangeText()

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

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

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

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

嗨,你可以试试这样做吗:

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 + ".";
        }