Честно говоря, не знаю, понравится ли DataSet
это, если это потокобезопасно. Но это единственное, что вы можете сделать с задачами, связанными с процессором:
public DataSet getResults(List<string> connstrings, string query)
{
var tasks = new List<Task>();
DataSet masterDS = new DataSet();
foreach (string con in connstrings)
{
tasks.Add(Task.Run(() =
{
MySqlConnection conn = new MySqlConnection(con);
try
{
conn.Open();
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
// NOTE changes here
da.Fill(masterDS);
}
catch (MySqlException ex)
{
int errorcode = ex.Number;
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
finally
{
conn.Close();
}
});
}
Task.WaitAll(tasks.ToArray());
Return MasterDS;
}
Возможно, вам может потребоваться возврат go к Merge
. Только делайте это после того, как все задачи выполнены. Если вы хотите быть действительно изощренным, вы можете вызвать Task.ContinueWith
, где вы добавляете каждую DS в параллельную очередь, а затем иметь другую Task.Run...
, которая берет из этой очереди и объединяет DS в одном потоке, пока DS все еще заполняются. Итак, к моменту завершения Task.WaitAll
у вас все будет готово