Вы пытаетесь получить доступ к списку TskList
из разных потоков без какой-либо синхронизации.Это может привести к любым проблемам.
Просто сделайте это:
var tasks = dt.AsEnumerable().Select(row => Task.Run(() =>
{
try
{
// some http call
}
catch (Exception ex)
{
// rewrap the needed information into your custom exception object
throw YourException(ex, row["ssub_msisdn"]);
}
});
// now you are at the UI thread
foreach (var t in tasks)
{
try
{
await t;
}
catch (YourException ex)
{
AppendTextBox(ex.SsubMsisdn + ", Error: " + ex.InnerException.Message, txtBoxResponse);
}
}
Task.Run
запустит задачу в пуле потоков, вам на самом деле не нужно Parallel.ForEach
.
На самом деле, если ваш код в try
только выполняет http-вызов, вам вообще не нужен Task
!Вы можете полностью избежать потоков, используя асинхронную версию, например, HttpClient.GetByteArrayAsync
или HttpClient.GetStreamAsync
+ Stream.CopyToAsync
.
E.г .: * 10101
HttpClient client = new HttpClient(); // maybe configure it
async Task ProcessRow(Row row) // put here the correct type
{
try
{
var str = await client.GetStringAsync(row[address]);
AppendTextBox(str, txtBoxResponse);
}
catch (HttpRequestException ex)
{
AppendTextBox(row["ssub_msisdn"] + ", Error: " + ex.Message, txtBoxResponse);
}
}
var tasks = dt.AsEnumerable().Select(row => ProcessRow(row));
await Yask.WhenAll(tasks);