2016-11-30 48 views
-1

我有一个十字线程操作,具有以下结构。十字线操作异常行为

异常是当我在记录查询操作上放置断点时,记录不为空。但是,当我删除断点并让程序执行时,记录始终为空。我已确保记录检索过程是正确的。这是一种交叉线程操作异常吗?

这里是调用程序

Invoke(new Action(() => 
    { 
     var filters = new KeyValuePair<string, object>[] 
      { 
      new KeyValuePair<string, object>("from_userid", ParentMessage.from_userid), 
      new KeyValuePair<string, object>("to_userid", this.SourceUser.id), 
      new KeyValuePair<string, object>("group_header_id", ParentMessage.group_header_id), 
      new KeyValuePair<string, object>("message", ParentMessage.message), 
      new KeyValuePair<string, object>("is_read", 0) 
      }; 

      MessagerLogModel MessageLog = null; 

      MessageLog = MessagerLogs.CustomFilter(filters).FirstOrDefault(); 


      if (MessageLog == null) 
      { 
       MessageBox.Show("message log model not found in database."); 
       return; 
      } 
})); 

而且,这里是检索数据库中记录的操作。

public static List<MessagerLogModel> CustomFilter(KeyValuePair<string, object>[] _params) 
{ 
    var result = new List<MessagerLogModel>(); 

    string Query = @"SELECT * FROM messager_logs"; 

    List<MySqlParameter> commandParams = new List<MySqlParameter>(); 

    foreach (KeyValuePair<string, object> param in _params) 
    { 
     if (commandParams.Count == 0) 
      Query += " WHERE "; 
     else 
      Query += " AND "; 

     if (param.Value == DBNull.Value) 
      Query += param.Key + " IS @" + param.Key; 

     else 
      Query += param.Key + " = @" + param.Key; 


     commandParams.Add(new MySqlParameter("@" + param.Key, param.Value)); 
    } 

    MySqlDataReader r = 
     MySqlHelper.ExecuteReader(Shared.getConnectionString(), 
     Query, commandParams.ToArray()); 

    while (r.Read()) 
     result.Add(dataToModel(r)); 

    r.Close(); 

    return result; 
} 
+1

这就是所谓的竞争条件。您需要确保该值不能在后台更改。例如,制作副本。 – SLaks

+0

我认为'Action'方法中的所有这些操作都在单个线程中。数据查询过程旁边的代码是否应该等待它完成执行? –

+1

这取决于“Invoke()”的功能。 – SLaks

回答

3

问题是您的操作中的“lambda”。您可以在其中包含一些值:它们在lambda被定义时不会被复制到lambda表达式中,而是在执行lambda时。像ParentMessage.from_userid这样的成员变量可能会在此期间发生变化。