私はマルチスレッドコーディングを試しています。私が並行してプロセスを実行したい場合。テーブルAとテーブルBとテーブルCを同時に照会したいとします。各スレッド内で、次のようにSqlCommand .ExecuteReaderを実行しています。マルチスレッドでのデリゲートとイベントの使い方C#
using System.Collections.Generic; System.Data.SqlClientを使用している ;
namespace MultiThread2
{
public class TableFieldArray
{
public string TableName { get; set; }
public string FieldName { get; set; }
}
static class MTProcess
{
const string connStr = "server=***;database=***;user id=***;password=***";
public static event GetStringArrayResult OnRecordsFoundMTS;
public static void GetStringArrays(TableFieldArray[] tableFieldArray)
{
foreach (TableFieldArray tf in tableFieldArray)
{
Thread thread = new Thread(() =>
{
ST_Process stp = new ST_Process(connStr);
stp.ListOfFieldValue(tf.TableName, tf.FieldName);
stp.OnRecordsFound += new GetStringArrayResult(getEvent);
});
thread.Start();
}
}
private static void getEvent(string[] result)
{
OnRecordsFoundMTS(result);
return;
}
// ---------------
public delegate void GetStringArrayResult(string[] output);
class ST_Process
{
public event GetStringArrayResult OnRecordsFound;
private readonly string _connStr;
public ST_Process(string connectionString)
{
_connStr = connectionString;
}
public void ListOfFieldValue(string tableName, string fieldName)
{
List<string> result = new List<string>();
using (SqlConnection sqlConn = new SqlConnection(_connStr))
{
sqlConn.Open();
string sqlText = string.Format("SELECT TOP 100 {0} FROM {1} ", fieldName, tableName);
using (SqlCommand sqlcmd = new SqlCommand(sqlText, sqlConn) { CommandType = System.Data.CommandType.Text })
{
var r = sqlcmd.ExecuteReader();
while (r.Read())
{
result.Add(r[fieldName].ToString());
}
OnRecordsFound(_result.ToArray());
}
sqlConn.Close();
}
}
}
}
別個のスレッドで実行されたときに問題があり、OnRecordsFound(_result.ToArrayは())オブジェクト参照がオブジェクトの例外エラーのインスタンスに設定されていない原因となります。どのようにマルチスレッド環境でこの設定を行うにはどのようなアイデア?
ようなスレッドセーフなコレクションクラスを使用する必要があります。それらのスレッドのどれかがリストを変更した場合は、 'lock()'を使ってそのアクセスを管理する必要があります。 – Amy
(ListOfFieldValueへの複数の呼び出しで)呼び出しコードを含めてください。 – mjwills
私はちょうど元の投稿に貼り付けました。Amy – Yogi