-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;
}
これは競合状態と呼ばれています。値がバックグラウンドで変更できないようにする必要があります。たとえば、コピーを作成します。 – SLaks
'Action'メソッドの中のこれらの操作は全て単一のスレッド上にあると仮定しました。データクエリプロシージャの次のコードが実行を終了するのを待つ必要がありますか? –
それは 'Invoke()'が何をするかによって異なります。 – SLaks