2016-11-30 17 views
-1

以下の構造のクロススレッド操作があります。クロススレッド操作の異常動作

レコードのクエリ操作でブレークポイントを設定すると、そのレコードはnullではありません。ただし、ブレークポイントを削除してプログラムを実行させると、レコードは常にNULLになります。私はレコードの検索プロセスが正しいことを確認しました。これは何らかのクロススレッド操作異常ですか?ここで

がinvoke手順

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

問題は、あなたのアクションに「ラムダ」です。ここにはいくつかの値が含まれています。ラムダが定義された時点ではラムダ式にコピーされませんが、ラムダが実行された時点でコピーされます。一方、ParentMessage.from_useridのようなメンバ変数が変更された可能性があります。

関連する問題