2016-04-28 57 views
3

我想從線程中調用一個名爲UpdateResults()的非靜態方法。這是我的代碼:不能使用非靜態方法的線程

class Live 
{ 
    Thread scheduler = new Thread(UpdateResults); 

    public Live() 
    { 
     scheduler.Start(); 
    } 

    public void UpdateResults() 
    { 
     //do some stuff 
    } 
} 

,但我得到這個錯誤:

A field initializer can not refer to the property, method or non-static field 'Live.UpdateResults()'

我怎樣才能解決這個問題?

回答

3

這與Thread無關。有關詳細情況,請參閱this問題。 解決您的問題,改變你的類,如下所示:

class Live 
{ 
    Thread scheduler; 

    public Live() 
    { 
     scheduler = new Thread(UpdateResults); 
     scheduler.Start(); 
    } 

    public void UpdateResults() 
    { 
     //do some stuff 
    } 
} 

由於喬恩斯基特提到了上述問題,從C#4規範的部分10.5.5.2:

A variable initializer for an instance field cannot reference the instance being created. Thus it is a compile-time error to reference this in a variable initializer, because it is a compile-time error for a variable initializer to reference any instance member through a simple-name.

當你寫new Thread(UpdateResults)你真的在寫new Thread(this.UpdateResults)

+0

只是一個問題:在'線程調度;'我得到'場 'LiveScore.scheduler' 分配,但它的價值是永遠使用',只是一個警報。 – Dillinger

+1

因爲您只在構造函數中使用私有字段。如果你不想在另一個方法中使用這個變量,那麼你最好使它在構造函數中是局部的。當你從另一個方法引用變量時,錯誤將消失 –

4

C#6.0解決方案:改變分配(=)來初始化=>

class Live { 
    // Please, note => instead of = 
    Thread scheduler => new Thread(UpdateResults); 

    public Live() { 
     scheduler.Start(); 
    } 

    public void UpdateResults() { 
     //do some stuff 
    } 
    } 
+0

這將有效地將它從字段更改爲屬性,因爲=>僅是標準getter的語法糖 – Fabjan

+0

是一個lamba表達式,對不對? :) – Dillinger

+1

@Dillinger:*語法*是一個lambda,但實際上它是一種初始值設定項(在實例創建時賦值) –

相關問題