Когда использовать асинхронное программирование с делегатами? - PullRequest
0 голосов
/ 25 июня 2018

Кажется, они делают одно и то же, но я не знаю, когда я должен использовать задачи, а когда обычные делегаты.

Рассмотрим пример ниже:

private async void Button_Click(object sender, RoutedEventArgs e) {
    UseDelegates();
    // await UseTasks();
}

private void UseDelegates() {
    Action action = () => {
        Thread.Sleep(TimeSpan.FromSeconds(2));
    };

    var result = action.BeginInvoke(unusedResult => {
        MessageBox.Show("Used delegate.BeginInvoke!");
    }, null);
    action.EndInvoke(result);
}

private async Task UseTasks() {
    await Task.Run(() => {
        Thread.Sleep(TimeSpan.FromSeconds(2));
    });
    MessageBox.Show("Used await with tasks!");
}

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

В вашем примере действительно не выполняется асинхронная работа. Похоже, что единственное, что вы хотите сделать, - это разгрузить некоторую синхронную работу в фоновый поток, чтобы поддерживать поток пользовательского интерфейса отзывчивым в течение времени, необходимого для завершения синхронного метода - Thread.Sleep в этом случае -

Как указано на MSDN ; Начиная с .NET Framework 4, параллельная библиотека задач (TPL) является предпочтительным способом написания многопоточного и параллельного кода. Это то, что делает ваш метод UseTasks(), то есть он использует Task.Run для планирования вызова на Thread.Sleep в потоке пула потоков с помощью планировщика задач TPL по умолчанию.

Шаблон BeginInvoke / EndInvoke известен как Модель асинхронного программирования (APM) . Этот шаблон больше не рекомендуется для новых разработок, как указано здесь .

Поэтому, чтобы ответить на ваши вопросы, вы, как правило, «должны использовать задачи» при разгрузке работы в фоновый поток в приложениях .NET 4+.

0 голосов
/ 25 июня 2018

В приведенном вами примере.Я бы использовал Task каждый раз.Библиотека и синтаксис были созданы с целью избавления от шаблонов типов BeginInvoke и EndInvoke.

Единственный раз, когда вы, вероятно, не хотите использовать Task поверх старой библиотеки, этов настольных приложениях, использующих BackgroundWorker, специально предназначенных для выполнения длительной фоновой работы, которые хотят легко сообщать о прогрессе в поток пользовательского интерфейса.Такие вещи не так элегантны с задачами.

...