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

时间:2013-03-07 09:31:55

标签: c# timer elapsed

如何在静态方法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();
}

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

6 个答案:

答案 0 :(得分:5)

我认为timer_Elapsed应该是static的原因没有任何理由。所以只需将其删除即可。

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

另一种方法是使ChangeText静态。但是,由于您要设置Label的文本,因此无法使用,因此您无论如何都需要Form的实例。

答案 1 :(得分:3)

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

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

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

此致

答案 2 :(得分:1)

使ChangeText成为一种静态方法。

public static void ChangeText()

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

只从静态方法调用静态方法, 将您的ChangeText()方法设为静态或将time_Elapsed方法设为非静态方法

答案 5 :(得分:1)

您好,您可以尝试如下:

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