函数中的 C# 变量随机变得不可用
C# variable in a function become randomly not available
我不确定我是否能够解释这种行为,但我会尝试。我有一个像仪表板这样的程序,其中一些图形模块在启动时被初始化,每个模块都有一个唯一的目的来显示图形有一个传递给它的函数来确定显示的数据。
模块构建(使用相应的函数初始化每个模块类型)在单独的线程中使用 Task 处理。但是随机地,其中一些函数停止工作,并且包含数据的列表停止可用,就好像它从未声明过一样。
这是其中一个函数,请记住,哪个函数抛出此错误是随机的,但其中一个函数总是会抛出异常。我真的无法追踪可能导致此行为的原因我考虑过资源被其他线程删除但此列表是在启动时创建的并且仅作为参考传递和使用。在程序的任何地方我都没有重置这个列表。相同的代码在其他项目中工作,并且在逐步调试时...我真的无路可走
private static IEnumerable<ICompositeValue> GroupEvent(IEnumerable<Event> events, DateTime referenceDate, Month month)
{
List<ICompositeValue> Values= new List<ICompositeValue>();
foreach (Days day in (Giorni[])Enum.GetValues(typeof(Days)))
{
if (day != Giorni.Sunday)
if (events== null) return null; //this was tried to catch the exception
Values.Add(new ICompositeValue()
{
Argument = day.ToString(),
Valore = event.Count(x => (int)x.DDB_APDATA.Value.DayOfWeek == (int)day && (int)x.DDB_APDATA.Value.Month == (int)month && x.DDB_APDATA.Value.Year == referenceDate.Year)
}); ;
}
return valori;
}
As shown in this image Visual Studio 甚至无法评估 List 值,就好像它从未被声明过一样
有人能给我指出正确的方向吗?
谢谢大家!
我只是想感谢那些试图帮助我的人。
我仍然不明白为什么调试器会这样操作,因为它向我显示“x”为空而不是内部 属性,但我设法找到了问题所在。我注意到来自 DataTable 的对象映射对于 DateTime 类型变量表现得很奇怪,而且确实不时返回 null
正如 Jeroen Mostert 所建议的那样,您的 lambda 中的某些 属性 似乎意外地为空。 events
不可用的原因是因为您的调试器上下文在 lambda 内部。
x => (int)x.DDB_APDATA.Value.DayOfWeek == (int)day && (int)x.DDB_APDATA.Value.Month == (int)month && x.DDB_APDATA.Value.Year == referenceDate.Year
因此 x
、DDB_APDATA
或 Value
之一可能为空。
我不确定我是否能够解释这种行为,但我会尝试。我有一个像仪表板这样的程序,其中一些图形模块在启动时被初始化,每个模块都有一个唯一的目的来显示图形有一个传递给它的函数来确定显示的数据。 模块构建(使用相应的函数初始化每个模块类型)在单独的线程中使用 Task 处理。但是随机地,其中一些函数停止工作,并且包含数据的列表停止可用,就好像它从未声明过一样。
这是其中一个函数,请记住,哪个函数抛出此错误是随机的,但其中一个函数总是会抛出异常。我真的无法追踪可能导致此行为的原因我考虑过资源被其他线程删除但此列表是在启动时创建的并且仅作为参考传递和使用。在程序的任何地方我都没有重置这个列表。相同的代码在其他项目中工作,并且在逐步调试时...我真的无路可走
private static IEnumerable<ICompositeValue> GroupEvent(IEnumerable<Event> events, DateTime referenceDate, Month month)
{
List<ICompositeValue> Values= new List<ICompositeValue>();
foreach (Days day in (Giorni[])Enum.GetValues(typeof(Days)))
{
if (day != Giorni.Sunday)
if (events== null) return null; //this was tried to catch the exception
Values.Add(new ICompositeValue()
{
Argument = day.ToString(),
Valore = event.Count(x => (int)x.DDB_APDATA.Value.DayOfWeek == (int)day && (int)x.DDB_APDATA.Value.Month == (int)month && x.DDB_APDATA.Value.Year == referenceDate.Year)
}); ;
}
return valori;
}
As shown in this image Visual Studio 甚至无法评估 List 值,就好像它从未被声明过一样
有人能给我指出正确的方向吗?
谢谢大家!
我只是想感谢那些试图帮助我的人。
我仍然不明白为什么调试器会这样操作,因为它向我显示“x”为空而不是内部 属性,但我设法找到了问题所在。我注意到来自 DataTable 的对象映射对于 DateTime 类型变量表现得很奇怪,而且确实不时返回 null
正如 Jeroen Mostert 所建议的那样,您的 lambda 中的某些 属性 似乎意外地为空。 events
不可用的原因是因为您的调试器上下文在 lambda 内部。
x => (int)x.DDB_APDATA.Value.DayOfWeek == (int)day && (int)x.DDB_APDATA.Value.Month == (int)month && x.DDB_APDATA.Value.Year == referenceDate.Year
因此 x
、DDB_APDATA
或 Value
之一可能为空。