я использую Task Parallel Library (TPL) и C# 4.5, чтобы реализовать эту бизнес-логику в приложения-службы Windows:Изменение Parallel.ForEach для лучшего подхода
- Получить JSON результат (список) из удаленного RESTful API
- для каждого элемента, получить JSON результата деталей из другого удаленного RESTful API
- для каждого элемента прикрепленной бизнес-объектов (1000+), используйте Parallel.ForEach сохранения в базу данных
В настоящее время проблема заключается в сохранении каждого элемента в базе данных (Sync DAL), поэтому Parallel.ForEach 1000 элементов выполняется навсегда, а приложение Windows Service работает медленнее и медленнее. У кого-нибудь есть хорошие идеи или лучший подход к повышению производительности?
Фрагмент кода:
/* Download a list from RESTful API URL.... */
var task = Task.Factory.StartNew(() => { return DownloadListFromRestAPI(); }, TaskCreationOptions.LongRunning);
task.ContinueWith(i => {
foreach (var r in i.Result)
{
/* For each item, download the item details from RESTful API URL.... */
var taskSecond = Task.Factory.StartNew(() => { return DownloadItemDetailFromRestAPI(r.id); }, TaskCreationOptions.LongRunning);
taskSecond.ContinueWith(m => {
/* For each item detail, get the related business objects, and start Database operation on each object.... */
List<Item> relatedItems_1000 = s.GetRelatedObjectsIds(m.Result.id);
/* parallel.ForEach - 1000 or more items */
Parallel.ForEach<Item>(relatedItems_1000, new ParallelOptions { MaxDegreeOfParallelism = 8 }, d => DBLongProcess(d)); /* The DB operation takes long time */
});
}
});
Update: (код для DBLongProcess() и замок (я добавил замок, потому что одновременно потоки могут пытаться изменить тот же объект в БД))
private void DBLongProcess(Item item)
{
dbDAL.InsertObjectDB(item));
}
public class DBDAL
{
private readonly object _lock = new object();
public void InsertObjectDB(Item item)
{
lock (_lock)
{
if(!item.hasDetail1()){
//insert item.detail1...
}
if(!item.hasDetail2()){
//insert item.detail2
}
}
}
}
Как «DBLongProcess» обеспечивает безопасность потоков? Если все сделано неправильно, это может стать источником вашей медлительности. Можете ли вы включить код для этого тоже? –
@ScottChamberlain, см. Мои обновления. Спасибо вам! – xoyoja
Неясно, в чем проблема. UI замедляется, потому что Background занимает слишком много ресурсов? – Nahum