无法将记录添加到作为方法

时间:2017-02-03 15:03:49

标签: c# .net linq

我有这堂课:

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
                 });
            }
        }
    }

现在我要做的是我想将类Test的错误列表作为参数传递给StartLongRunningProcess方法,并从那里我想将所有错误记录存储在Test Class的Error Variable中。

这样做的原因是因为我有一个方法getCurrentData,每5秒调用一次,以获取当前正在运行导入项目的错误记录。所以在所有导入项目的末尾,我会准备好错误列表所有进口商品。

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()   
           }

StartLongRunningProcess的参数是对象,因为此方法在我的另一个页面的线程池上运行,这就是我将数据类型保存为参数数据的对象的原因。

我也不能像下面那样列出导入列表:

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

1 个答案:

答案 0 :(得分:1)

<强>问题

  

测试类的启动方法正在线程池上运行.still Test.errors应该是线程安全的吗?

鉴于你的话:

function unwrap (err) {
    let res = err.rejection ? err.rejection : err;

    while (res.originalError) {
        res = res.originalError;
    }
    res.name = res.name || 'unknown';
    return res;
}

您只需同步调用方法this.ImportResult.StartLongRunningProcess(obj1);//pass each import record to this method 即可。在这种特殊情况下,不需要担心线程安全性,因为StartLongRunningProcessStart都在同一个线程中执行。

但是,也不需要StartLongRunningProcessStartLongRunningProcess参数;)只需让它object

但是如果string importData, List<Error> errors在另一个线程(而不是StartLongRunningProcess)中开始并且你在Start循环中启动了许多线程,那么显然你应该关注线程安全性。因为在不同线程上运行的多个foreach可能会调用相同StartLongRunningProcess对象的Errors.Add(error)

...现在我刚刚注意到原始问题中的最后一个注释。为什么你不能这样做?什么编译器说?

首先。两个类都没有Test初始化。在构造函数中执行。

其次,将Errors更改为:

datas[1]. // Here i would like to add record to error list of Test class.

有效吗?

顺便说一句,(data[1] as List<Error>).Add(new Error ...); 应该是针对Test.Errors操作的线程安全类型。例如,您可以使用Add