“从某个线程调用方法时,无法评估表达式,因为代码已经过优化”

时间:2010-08-30 08:56:40

标签: .net multithreading

我在我的应用程序中遇到了一个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()方法都会出现“无法评估...”的异常情况。从主线程调用它时,此方法可以正常工作。 (我从代码错误处理中省略了......)

很抱歉这篇长篇文章。

再次感谢,

玛雅

1 个答案:

答案 0 :(得分:2)

这可能是VS调试器上下文的问题。当你在main()中运行时,上下文是清晰的 - 你在进程的主/唯一线程中。当您生成新线程时,您必须确保在观察感兴趣的线程/代码的本地数据之前实际上在该线程中。在Load()函数中放置一个断点,以确保在观察感兴趣的数据之前,您实际上处于正确的线程中。

另一种可能性是(如消息所示)您正在调试具有优化功能的发布版本,并且无法查看vars。首先使用Debug构建尝试这个。