Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Не могу понять тут один паттерн с Task  [new]
fkfka
Member

Откуда:
Сообщений: 131
Сегодня надо было сделать немного рисёрч, на немного экзотичную тему - сдружить Task-овую асинхронность со старым паттерном асинхронного вызова, кто-нибудь из старперов-дотнетчиков наверняка знает - это всякий IAsyncResult/BeginXXX(...)/EndXXX(...). Ну, это ладно, суть, в общем-то не в этом. Я несколько раз сегодня пока в связи с этим гуглил наткнулся на такую вот идиому, суть которой, если выкинуть детали, в таком:

TaskCompletionSource<int> completionSource = new();
completionSource.TrySetResult(42);
var task = completionSource.Task;

То, что оно делает, совершенно понятно. Но чего никак не могу понять, это чем это отличается от просто:

var task = Task.FromResult(42);

И, ладно бы, я это просто случайно увидел у какого-нибудь индуса, но я это сегодня видел местах в трех, вот и весьма заинтересовало.
28 май 21, 21:27    [22328680]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять тут один паттерн с Task  [new]
hVostt
Member

Откуда:
Сообщений: 19326
fkfka,

Ещё есть простое решение:

public static Task<int> ReadAsync(this Stream stream,
                                  byte[] buffer, int offset,
                                  int count)
{
    if (stream == null)
       throw new ArgumentNullException("stream");

    return Task<int>.Factory.FromAsync(stream.BeginRead,
                                       stream.EndRead, buffer,
                                       offset, count, null);
}


fkfka
То, что оно делает, совершенно понятно. Но чего никак не могу понять, это чем это отличается от просто:


Ну это переводит состояние таски, асинхронно. На этом в принципе строится стейтмашина.
29 май 21, 21:32    [22328871]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять тут один паттерн с Task  [new]
fkfka
Member

Откуда:
Сообщений: 131
hVostt,

У меня задача прямо диаметральная - таск в "старый" асинк. Но, с самой-то задачей все абсолютно понятно, могу сделать и туда и сюда, без вопросов. Меня заинтересовало именно, что тут, в данном примере, надо просто создать "сразу конченный" таск, и зачем, вот, пассажиры создают его таким извилистым способом, как я привел, а не просто через FromResult(...). Может тут есть какое-то тайное знание, которым я не владею.
30 май 21, 15:46    [22328980]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять тут один паттерн с Task  [new]
hVostt
Member

Откуда:
Сообщений: 19326
fkfka,

Через FromResult ты генеришь сразу завершённую таску, ни о каком асинхронном взаимодействии тут речи нет. Используются тогда, когда ты сразу можешь отдать готовый результат.

Если же ты уже начал асинхронное взаимодействие через TCS, то будь добр веди до конца.

Т.е. именно в твоём случае, TCS не нужен, так как отдаёшь результат 100% синхронно, а Task выступает лишь обёрткой для готового результата. В данном случае можно FromResult.
30 май 21, 22:11    [22329035]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять тут один паттерн с Task  [new]
fkfka
Member

Откуда:
Сообщений: 131
hVostt
Через FromResult ты генеришь сразу завершённую таску,

Ну а так, что ( не я) генерю:

fkfka
TaskCompletionSource<int> completionSource = new();
completionSource.TrySetResult(42);
var task = completionSource.Task;

Что там будет в "task? Да та же самая законченная таска, которую я получу через FromResult.
30 май 21, 22:29    [22329041]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять тут один паттерн с Task  [new]
fkfka
Member

Откуда:
Сообщений: 131
hVostt
В данном случае можно FromResult.

Ну так и я о том же.
30 май 21, 22:31    [22329042]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять тут один паттерн с Task  [new]
hVostt
Member

Откуда:
Сообщений: 19326
fkfka
Что там будет в "task? Да та же самая законченная таска, которую я получу через FromResult.


По логике да, но меньше телодвижений.
30 май 21, 22:35    [22329043]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить