我已經創建了一些異步方法,並且已經將這些記錄添加到這些方法中的dataTable中,然後在異步方法完成後批量複製dataTable。我發現dataTables不是線程安全的,這是我的問題的根源,因爲我注意到一個或兩個記錄沒有實際插入。我有這樣的事情:異步方法中的數據表
private async void yea()
{
DataTable t = new DataTable();
//Fill the data table with its columns
IEnumerable<Task<string>> results = items.Select(q => AsyncFunction(q.id, t));
Task<string[]> allTasks = Task.WhenAll(results);
string[] allResults = await results;
using (SqlConnection conn = new SqlConnection(_connString))
{
conn.Open();
using (SqlBulkCopy bc = new SqlBulkCopy(conn))
{
bc.BatchSize = 1000;
bc.DestinationTableName = tableName;
bc.WriteToServer(t);
}
}
}
public async Task<string> AsyncFunction(int id, DataTable t)
{
//await another Async function
DataRow dr = t.NewRow();
dr["ID"] = id;
//Many More columns
t.Rows.Add(dr);
return "success";
}
就像我說的我的問題是,大容量複製往往會遺漏一些記錄。如何批量複製所有記錄而不會丟失到非線程安全調用?