Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Заблокирован

Что TaskCompletionSource<TResult> может такого, чего не может Task<TResult>?

04.11.2023, 23:45. Показов 1075. Ответов 6

Студворк — интернет-сервис помощи студентам
Что TaskCompletionSource<TResult> может такого, чего не может Task<TResult>?
Те примеры использования TaskCompletionSource<TResult>, что я увидел, как мне показалось, можно было бы реализовать и с помощью Task<TResult>. То есть, с помощью методов Task<TResult>.
Например вот: https://learn.microsoft.com/ru... s-manually
У Task<TResult> есть методы, позволяющие завершить задачу успешно с неким результатом или с исключением.
Почему я не прав? То есть, что TaskCompletionSource<TResult> может такого, чего категорически не может Task<TResult>?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2023, 23:45
Ответы с готовыми решениями:

Делегат Func с несколькими параметрами в Task<Tresult>
Добрый день. В данный момент начал изучать TPL и возник вопрос по поводу использования параметризованного Task. История следующая: ...

Cast<TResult> приведение к заранее неизвестному типу
Добрый день. У меня есть переменная result типа ArrayList. Привести ее к массиву типа string можно так: string mas =...

Что может в PHP PHPstorm, чего не может Visual Studio?
Добрый день! Я начал учить PHP. Среди разработчиков PHP популярна среда PHPstorm. Для PHP код можно писать в Visual Studio. И возник...

6
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
04.11.2023, 23:58
нету смысла использовать
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
05.11.2023, 00:14
Цитата Сообщение от titan4ik Посмотреть сообщение
Что TaskCompletionSource<TResult> может такого, чего не может Task<TResult>?
Ну, судя по названию, у них разная ответственность.
Task - это awaitable объект. Некая асинхронная операция.
TaskCompletionSource - это универсальный сигнальный механизм, на базе которого можно строить различные Task-"комбинаторы", например:
1. Pause/Resume
2. Однократная инициализация в асинхронном API.
3. Всякие Interleaving-реализации. Например, можно взять коллекцию тасок, и ожидать их в хронологическом порядке. Stephen Toub об этом еще в 2012 году писал.
Дальше от фантазии зависит.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.11.2023, 01:12
Лучший ответ Сообщение было отмечено titan4ik как решение

Решение

Есть у вас проприетарная либа работающая либо на event, либо на callback delegate. А код хочеться организовать асинхронный. Вот тут поможет TaskCompletionSource.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var result = await GetResultAsync();
Console.WriteLine(result);
Console.ReadKey();
 
Task<string> GetResultAsync()
{
    var module = new NyaModule();
    var s = new TaskCompletionSource<string>();
    module.Start(s.SetResult);
    return s.Task;
}
 
#region код либы, доступа нет
 
class NyaModule
{
    public void Start(Action<string> callback)
    {
        new Thread(() =>
        {
            Thread.Sleep(TimeSpan.FromSeconds(2));
            callback($"result = {Guid.NewGuid()}");
        })
        .Start();
    }
}
 
#endregion
2
Заблокирован
05.11.2023, 12:19  [ТС]
А если так вопрос поставить. Как опрос. А вам самим часто TaskCompletionSource<TResult> приходится использовать?

Добавлено через 54 минуты
Wolfdp, спасибо! А то примеры, которые я видел были такими, что не было понятно (мне) в чем полезность доп возможностей TaskCompletionSource.
Теперь интересно насколько часто практически люди сталкиваются с необходимостью это применять. Это такая полезная интегральная характеристика. То, что называют "средней температурой по больнице". Иногда полезно знать)
Есть средства или технологии, которые так или иначе почти постоянно используются, а есть такие, которые используются крайне редко. Соответственно, первые используют почти все. А вторые - оч малый процент программистов

Добавлено через 8 минут
Я отметил как решение ответ от Wolfdp, потому что в нем увидел практический понятный пример. Но решением также является ответ от IamRain (ответ в общем виде), и ответ от Dr9vik (теперь я понимаю, что это тоже очень полезный для меня ответ).
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.11.2023, 14:07
Цитата Сообщение от titan4ik Посмотреть сообщение
Как опрос. А вам самим часто TaskCompletionSource<TResult> приходится использовать?
Редко, но необходимость возникает.
Пример, который первый в голову пришёл: создание таска для метода SynchronizationContext.Post, чтобы можно было ожидать завершения переданного метода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    public static class SynchronizationContextHelper
    {
        public static async Task PostAsync<T>(this SynchronizationContext context, Action<T?> action, T? state)
        {
            ArgumentNullException.ThrowIfNull(context, nameof(context));
            TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
            context.Post(_ =>
            {
                try
                {
                    action(state);
                    taskCompletionSource.SetResult();
                }
                catch (Exception ex)
                {
                    taskCompletionSource.SetException(ex);
                }
            }, null);
            await taskCompletionSource.Task;
        }
        public static async Task<TResult> PostAsync<T, TResult>(this SynchronizationContext context, Func<T?, TResult> func, T? state)
        {
            ArgumentNullException.ThrowIfNull(context, nameof(context));
            TaskCompletionSource<TResult> taskCompletionSource = new TaskCompletionSource<TResult>();
            context.Post(_ =>
            {
                try
                {
                    TResult result = func(state);
                    taskCompletionSource.SetResult(result);
                }
                catch (Exception ex)
                {
                    taskCompletionSource.SetException(ex); ;
                }
            }, null);
            return await taskCompletionSource.Task;
        }
    }
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.11.2023, 22:54
Цитата Сообщение от titan4ik Посмотреть сообщение
А если так вопрос поставить. Как опрос. А вам самим часто TaskCompletionSource<TResult> приходится использовать?
Цитата Сообщение от titan4ik Посмотреть сообщение
Теперь интересно насколько часто практически люди сталкиваются с необходимостью это применять
Тут надо разделить разработчиков на две категории: те, кто использует инструменты для решения своих бизнес-задач и те, кто эти инструменты создают. Последних, естественно, меньше и именно для них предназначен TaskCompletionSource.
Пример из личного опыта: реализация асинхронного дуплексного протокола над TCP, где через одно соединение многопоточно отсылаются разные сообщения и принимаются ответы когда-нибудь потом не в том же порядке, в котором сообщения отправлялись (если интересно поиграться, описание давал тут). Абстракция над этим протоколом имеет интерфейс вида Task<TResult> SendMessage(Request), а под капотом — обработка входящих сообщений и TaskCompletionSource для привязки конкретного вызова SendMessage к полученному сообщению по ID сообщения.
Подозреваю, что всякие библиотеки для работы с брокерами сообщений вроде RabbitMQ, где обмен сообщениями производится аналогично через одно соединение, используют его же.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.11.2023, 22:54
Помогаю со студенческими работами здесь

От чего может может течь холодильник?
У меня есть холодильник, который начал течь снизу морозильной камеры и в последнее время очень сильно. От чего все это происходит? И как...

Может вы сможете исправить ошибку в коде. Никак не пойму, что хочет. До этого все работало. Может случайно что-то стер?
Functions.h(300,55): error C2597: недопустимая ссылка на нестатический член &quot;BinarySearchTree::root&quot; Вот тут проект-...

Разваливается RAID1 - что можно сделать, и, вообще, из-за чего это может происходит?
Материнская плата: Asus X79-Deluxe Жесткие диски: 2 диска ST31000524AS система стоит естественно на отдельном SSD. Проблема: ...

Надо создать точку доступа на Windows XP или может что-то подобное. Может и ошибаюсь. Научите идиота
Короче:есть комп с Windows XP. Есть Asus WL-169gE. Хочу создать вай-фай на компе что бы через телефон, PSP и планшетник в инет входить. Я...

Мистика? Да не, быть такого не может
Мой телефон-Highscreen Omega Prime Mini. Нориальный телефон, удобен в использовании...Но... недавно я стала замечать, что он на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru