我在我的应用程序中遇到了一个strage行为。我有一个函数:在类Task中加载try-catch块。当我从主线程调用它时:Task.Load()它运行正常。
我创建了一个运行某些方法的线程。当我从线程方法调用Task.Load()时,我收到了该消息: “无法评估表达式,因为代码已优化或本机帧位于调用堆栈之上”。
有人可以指出问题是什么吗?
提前致谢。
玛雅
感谢您的回复。
史蒂夫,我正在使用调试版本。我认为问题与你的第一个概念有关,但我不知道如何处理它。这是示例代码,也许它会有所帮助。该示例包含带有Load方法的Task类,以及用于启动从中调用Load方法的新线程的Dispatcher类:public class Task{
public long Id{get; set;}
public string Name{get; set;}
public void Load(DataRow row){
try{
Id = (long)row["id"];
Name = row["name"].ToString();
}
catch(..){}
}
}
public class Dispatcher{
Thread dispatchingThread = new Thread(getTasks);
private getTasks(){
DataTable dt = DAL.GetPendingTasks();
foreach(DataRow row in dt.Rows){
Task task = new Task
task.Load(row);
//process task...
}
}
}
每次在其他地方,Load()方法都会出现“无法评估...”的异常情况。从主线程调用它时,此方法可以正常工作。 (我从代码错误处理中省略了......)
很抱歉这篇长篇文章。
再次感谢,
玛雅
答案 0 :(得分:2)
这可能是VS调试器上下文的问题。当你在main()中运行时,上下文是清晰的 - 你在进程的主/唯一线程中。当您生成新线程时,您必须确保在观察感兴趣的线程/代码的本地数据之前实际上在该线程中。在Load()函数中放置一个断点,以确保在观察感兴趣的数据之前,您实际上处于正确的线程中。
另一种可能性是(如消息所示)您正在调试具有优化功能的发布版本,并且无法查看vars。首先使用Debug构建尝试这个。