2010-12-05 24 views
1

你將如何發送/傳遞實例引用到新的任務?C# - 發送UI參考到Task.Factory.StartNew();?

比方說,我有這樣的:

public BlockingCollection<string> blockingCollection = new BlockingCollection<string>(); 
    textBox_txt.Text = "Result: "; 
    public Task t = Task.Factory.StartNew(() => 
    { 
     foreach (string value in *???1*.blockingCollection.GetConsumingEnumerable()) 
     { 
      *???1*.blockingCollection.Take() 
      [...bla...] 
      *???2*.Invoke(new updateTextBox_txtCallback(*???2*.updatetextBox_txt) 
          , new object[] { "THE RESULT!\r\n" }); 
     }     
    }); 

我猜測,在這裏的某個地方StartNew(() =>我要傳遞給blockingContent和文本框的引用。我環顧四周,但無法弄清楚語法。 (它很毛茸茸)

請幫忙。因此,如果我從任務中調用一個靜態對象,它顯然是有效的;但我需要任務來處理實例;即blockingCollection和updateTextBox_txtCallback Invoke。

回答

1

我轉載了您的問題,並在下面給出瞭解決方法。問題在於,您正在將Task用作類中的字段,因此它只能引用靜態成員,因爲在構造函數運行之前實例尚未構建(在初始化類之前調用​​字段初始值設定項)。 從C#規範(10.5.5.2):

一個實例 字段變量初始值不能引用被創建的實例 。因此,編譯時錯誤在變量初始值設定項中引用此 ,因爲它是 編譯時錯誤的變量 初始化程序通過簡單名稱引用任何實例 成員。在 示例類A {int x = 1; int y = x + 1; //錯誤,參考 實例成員} this變量 y的初始值設定項導致 編譯時錯誤,因爲它 引用了正在創建的實例 的成員。

基本上,你有兩個選擇:

  1. 初始化你的任務變的 構造
  2. 使用,而不是用於檢索的方法

例子:

public class Foo 
{ 
    public string myProperty = "foobar"; 
    public Task t; 

    public Foo() 
    { 
     t = Task.Factory.StartNew(() => 
     { 
      myProperty = "test"; 

     }); 
    } 

    //THIS won't compile 
    //public Task t = Task.Factory.StartNew(() => 
    //{ 
    // myProperty = "test"; 

    //}); 

    public Task GetTask() 
    { 
     Task t = Task.Factory.StartNew(() => 
     { 
      myProperty = "test"; 

     }); 
     return t; 
    } 
} 
1

您不必傳遞參考,因爲C#支持closures。只需用變量牽着你StartNew塊內部的引用將導致編譯器生成封裝了代碼,你引用到傳遞到匿名方法狀態對象:

textBox_txt.Text = "Result: "; 
public Task t = Task.Factory.StartNew(() => 
{ 
    // use textBox_txt in this block - the compiler 
    // will handle the passing of actual reference to the 
    // anonymous method for you     
}); 

我強烈建議The Beauty of Closures更多這方面的信息特徵。

現在,關閉一個作爲UI元素引用的值是否是個好主意,這是一個完全不同的討論。

+0

這不起作用。我需要引用,否則我會得到「字段初始值設定項不能引用非靜態字段」或「在當前上下文中不存在」。 – Spectraljump 2010-12-05 18:04:52

+0

該錯誤必須來自其他地方 - 我沒有看到您發佈的代碼中會產生該問題的任何內容。 – 2010-12-05 18:06:52