我有这堂课:
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>();
答案 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
即可。在这种特殊情况下,不需要担心线程安全性,因为StartLongRunningProcess
和Start
都在同一个线程中执行。
但是,也不需要StartLongRunningProcess
带StartLongRunningProcess
参数;)只需让它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
。