2017-02-03 27 views
0

我有這個類:無法記錄添加到列表中的對象傳遞給方法

Public class Error 
{ 
    public string ErrorMessage { get; set; } 
} 

public class Test 
    { 
     public int Id { get; set; } 
     public Import ImportResult { get; set; } 
     public List<Error> Errors { get; set; } 
     public void Start(object data) 
     { 
      object[] obj = data as object[]; 
      string[] importList = { "Item1", "Item2", "Item3", "Item4" }; 
      foreach (var item in importList) 
      { 
       object[] obj1 = new object[2]; 
       obj1[0] = item; 
       obj1[1] = Errors; 
       this.ImportResult = new Import(); 
       this.ImportResult.StartLongRunningProcess(obj1);//pass each import record to this method 
      } 
     } 
    } 

public class Import 
    { 
     public int Id { get; set; } 
     public List<Error> Errors { get; set; } 
     public void StartLongRunningProcess(object data) 
     { 
      object[] datas = data as object[]; 
      string import = datas[0].ToString(); 
      try 
      { 
       // here I have along running process 
      } 
      // Here I store my error result in above list in long running process 
      catch (Exception ex) 
      { 
       datas[1]. // Here I would like to add record to error list of Test class. 
       Errors.Add(new Error 
       { 
        ErrorMessage = ex.message 
       }); 
      } 
     } 
    } 

現在我所要做的是我想通過一流的試驗錯誤列表作爲參數來StartLongRunningProcess方法和從那裏我想將所有錯誤記錄存儲在Test類的錯誤變量中。

這樣做的原因是因爲我有1個方法getCurrentData,每5秒調用一次,以獲取當前正在運行的導入項目的錯誤記錄。因此,在所有導入項目結束時,我會爲所有導入項目準備好錯誤列表。 StartLongRunningProcess的

public string getCurrentData() //called every 5 seconds to get latest data 
     { 
      var data = TestList.FirstOrDefault(x => x.Key == 100).Value; 
      response = new 
      { 
       errors = data.Errors.Select 
         (er => new 
         { 
          //error properties 
         }).ToList() 
      } 

參數爲對象,因爲此方法是從我的另一個頁面線程池運行,這就是爲什麼我一直作爲數據類型對象的參數數據。

我也不能作出進口的列表如下圖所示:

public List<Import> ImportResults = new List<Import>(); 
+0

你正在傳遞'item',它是'string'。然後你'string'作爲'object []' –

+0

@SergeyBerezovskiy:對不起,這是一個錯誤。更新了我的問題 –

回答

1

問題

測試類的

Start方法是在線程pool.still Test.errors運行應該是線程安全的? ?

鑑於你行:

this.ImportResult.StartLongRunningProcess(obj1);//pass each import record to this method 

你只是syncronously調用方法StartLongRunningProcess。在這種特殊情況下,不需要擔心線程安全問題,因爲StartStartLongRunningProcess都在同一個線程中執行。

但是,也沒有必要有StartLongRunningProcessobject參數;)只要讓它需要string importData, List<Error> errors

但是,如果StartLongRunningProcess在另一個線程(比Start)開始,並且你的許多啓動在foreach循環,那麼顯然你應該關心線程安全性。因爲在不同線程上運行的多個StartLongRunningProcess可能會調用同一個Test對象的Errors.Add(error)

...現在我只注意到你原來問題中的最後一個註釋。爲什麼你不能這樣做?編譯器說什麼?


首先。這兩個類都沒有Errors初始化。在構造函數中執行。

其次,改變datas[1]. // Here i would like to add record to error list of Test class.到:

(data[1] as List<Error>).Add(new Error ...); 

是否行得通?

Btw,Test.Errors應該是針對Add操作的線程安全類型。例如,您可以使用ConcurrentQueue<T>

+0

你是什麼意思的假設類型?真正的問題是我想獲得每個進口項目的進展在執行任何導入項目時出現任何錯誤。如果是,則添加這些錯誤以列出並顯示它 –

+0

@學習sry,現在我明白了。將很快更新:) – pkuderov

+0

我已經告訴過爲什麼參數的數據類型是對象的原因,因爲在另一個頁面上使用了StartLongRunningProcess方法,並且StartLongRunningProcess在threadpool上運行,並且使用線程池,您只能將參數作爲對象傳遞:) –