Я новичок в TPL (Task-Parallel Library) и мне интересно, является ли следующий способ наиболее эффективным способом ускорения 1 или более задач, сопоставления результатов и отображения их в сетке данных.
- Search1 & Search2 взаимодействуют с двумя отдельными базами данных, но возвращают одинаковые результаты.
- Я отключаю кнопки и включаю счетчик.
- Я запускаю задачи с помощью одного вызова метода ContinueWhenAll.
- Я добавил планировщик в вызов ContinueWhenAll для обновления кнопок формы, сетки данных и отключения счетчика.
В: Я делаю это правильно? Есть ли лучший способ?
В: Как я могу добавить отмену / проверку исключений к этому?
В: Если бы мне нужно было добавить отчеты о проделанной работе - как бы я это сделал?
Причина, по которой я выбрал этот метод, скажем, фоновый, заключается в том, что я мог запускать каждую задачу БД параллельно или последовательно. Кроме того, я подумал, что было бы забавно использовать TPL ... однако, поскольку я не смог найти никаких конкретных примеров того, что я делаю ниже (несколько задач), я подумал, что было бы неплохо поставить его здесь, чтобы получить ответы, и, надеюсь, быть примером для других.
Спасибо!
Код:
// Disable buttons and start the spinner
btnSearch.Enabled = btnClear.Enabled = false;
searchSpinner.Active = searchSpinner.Visible = true;
// Setup scheduler
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
// Start the tasks
Task.Factory.ContinueWhenAll(
// Define the search tasks that return List<ImageDocument>
new [] {
Task.Factory.StartNew<List<ImageDocument>>(Search1),
Task.Factory.StartNew<List<ImageDocument>>(Search2)
},
// Process the return results
(taskResults) => {
// Create a holding list
List<ImageDocument> documents = new List<ImageDocument>();
// Iterate through the results and add them to the holding list
foreach (var item in taskResults) {
documents.AddRange(item.Result);
}
// Assign the document list to the grid
grid.DataSource = documents;
// Re-enable the search buttons
btnSearch.Enabled = btnClear.Enabled = true;
// End the spinner
searchSpinner.Active = searchSpinner.Visible = false;
},
CancellationToken.None,
TaskContinuationOptions.None,
scheduler
);