« first day (1067 days earlier)      last day (1964 days later) » 

6:21 AM
стоит задача опросить несколько урлов и "кто быстрее ответит - у того и взять результат". То есть как Task.WhenAny но "получить первый успешнй результат"

Stephen Cleary предолжил решение основываясь на методе расширении OrderByCompletion, то есть упорядочиваем таски по завершению и потом смотрим на успешность таски и возвращаем если успешна
а потом он взял и вырезал метод расширение OrderByCompletion "OrderByCompletion has been removed. It is better to introduce a higher-level async method rather than to "process tasks" as they complete."

а значит нужно решение без него
получается что то типа
private Task<T> GetValueAsync<T>(IReadOnlyList<string> urls, CancellationToken ct)
{
var tasks=new List<Task>(urls.Count);
var tsk = new TaskCompletionSource<T>();
var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
int faultedTreshold = urls.Count;
foreach (var url in urls)
{
var task = ResolveDataAsync(url, cts.Token);
task.ContinueWith((t, state) =>
{
if (t.IsFaulted)
{
var faultedIndex = Interlocked.Decrement(ref faultedTreshold);
if (faultedIndex <= 0)
tsk.SetException(new Exception("all tasks failed"));
отступы (
paste.org.ru/?b04upq так виднее. есть ли тут ошибки?
 
private Task<T> GetValueAsync<T>(IReadOnlyList<string> urls, CancellationToken ct)
{
    var tasks=new List<Task>(urls.Count);
    var tsk = new TaskCompletionSource<T>();
    var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
    int faultedTreshold = urls.Count;
    foreach (var url in urls)
    {
        var task = ResolveDataAsync(url, cts.Token);
        task.ContinueWith((t, state) =>
        {
            if (t.IsFaulted)
            {
                var faultedIndex = Interlocked.Decrement(ref faultedTreshold);
кнопочка fixed font есть же
 
ну вот как ты это сделал? ведь туда я вставил то, что у меня в блокноте. и сюда я вставлял тоже из блокнота
где кнопка
 
появляется когда многострочный текст
 
мде. "интуитивно"
 
¯\_(ツ)_/¯
 
6:33 AM
ладно. а по теме вопроса.
 
ну вроде нормально выглядит
не понятно только зачем там T
чувствую, что можно сделать как-то проще, но пока не знаю как
может и нельзя
Можно еще попробовать идею отсюда: sergeyteplyakov.blogspot.com/2015/06/…
 
ну это вариант без OrderByCompletion
 
Смотрите:
    while (tasks.Count != 0)
    {
        var completedTask = await Task.WhenAny(tasks);

        tasks.Remove(completedTask);
проверяем completedTask и если OK, то просто break цикл
 
плохой метод по причине постоянного вызова Task.WhenAny с разным количеством задач
 
чем плохо?
 
6:45 AM
6
Q: Is there default way to get first task that finished successfully?

SicLets say that i have a couple of tasks: void Sample(IEnumerable<int> someInts) { var taskList = someInts.Select(x => DownloadSomeString(x)); } async Task<string> DownloadSomeString(int x) {...} I want to to get the result of first successful task. So, the basic solution is to write someth...

 
куда там смотреть?
 
ну сам вопрос на эту тему что такой метод вызывает
But this solution seems to run N+(N-1)+..+K tasks. Where N is someInts.Count and K is position of first successful task in tasks, so as it's rerunning all task except one that is captured by WhenAny.

а если по простому, то он раз за разом загоняет в When.Any новый список задач, который каждый раз обрабатыавется заново.
 
Ну я не думаю, что там большие такие накладные расходы, чтоб прям это было плохим решением
 
ну все можно обернуть в метод и будет все WhenAnySuccess если уж на то пошло. Мне все таки больше интересна производительность
 
 
1 hour later…
8:06 AM
@АндрейNOP даже тот же тепляков позже добавил другую имплементацию OrderByCompletion вместо while (tasks.Count != 0)
/// <summary>
        /// OrderByCompletionNaive has significant drawback - O(N^2) complexity and O(N^2) number of continuations.
        /// Current implemnetation should solve this issue.
        /// </summary>
        public static IEnumerable<Task<T>> OrderByCompletion<T>(this IEnumerable<Task<T>> taskSequence)
        {
            // Need to return task immediately, but it should be in complete state when the first task would be completed!
            Contract.Requires(taskSequence != null);
по той же причине "has significant drawback - O(N^2) complexity and O(N^2) number of continuations."
 
8:31 AM
ок
 

« first day (1067 days earlier)      last day (1964 days later) »