Я создаю новый BackgroundWorker
каждый раз, когда мне нужно выполнить какую-либо задачу Async и после завершения работы, но я сомневаюсь, что это полностью ее использует, потому что метод Dispose реализован по Системе. ComponentModel.Component
Создание новой BackgroundWorker для каждой задачи async
При типичном запуске программы могут быть созданы тысячи из них. Все в порядке, если миллионы из них (чтобы быть в безопасности) создаются или я должен делать это по-другому?
Большая часть работы async - это ввод-вывод, и я не могу использовать async/await, потому что я использую .NET 4 (не могу использовать 4.5).
Я завернул все это в этом методе:
public void AsyncDo(Action Action, Action ActionFinish = null)
{
using (BackgroundWorker bw = new BackgroundWorker()) {
bw.DoWork +=() => Action();
bw.RunWorkerCompleted += (s, e) =>
{
if (ActionFinish != null)
ActionFinish();
if (e.Error != null)
OnException(e.Error);
};
bw.RunWorkerAsync();
}
}
Исходя из ответов, я обновил его с
Task t = new Task(action);
t.Start();
Но я получаю ошибку кросс-нить, когда я сделайте actionFinish()
, объединив его с action
или позвонив по телефону t.ContinueWith()
. Это было не так в BGW, это не требовало вызова для RunWorkerCompleted
. Я не могу изменить каждый вызов этого метода, чтобы заставить их использовать вызов, что мне делать?
BackgroundWorker предназначен только для сценариев пользовательского интерфейса. Звучит подозрительно, что у вас их будет 1000. Что это за GUI? – usr
Не надо. Задачи полностью заменяют BackgroundWorker. BackgroundWorker существует только для обратной совместимости и намного тяжелее Заданий. Это также совершенно непригодно для асинхронной работы - нет возможности комбинировать асинхронные операции, например, с помощью 'async/await' –
Что вы делаете? Нет причин использовать тысячи или миллионы задач, а тем более BackgroundWorkers. Для обработки большого количества данных используйте Parallel.For или PLINQ. Чтобы запросить запросы, используйте ActionBlock. Чтобы выполнить работу асинхронно за пользовательским интерфейсом, используйте 'async/await'. –