powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / skip task by timeout
15 сообщений из 15, страница 1 из 1
skip task by timeout
    #39476783
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде запускаю простую демку, чтоб пропустить таски, которые выполняют больше, чем установил по времени, но получаю пустую коллекцию хотя ожидал 1 задачу. что не так сделал кто подскажет?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
static void Main(string[] args)
        {
            var tasks = new List<Task<int>> {
                new Task<int>(() => { Task.Delay(5000).Wait(); return 5000;}) ,
                new Task<int>(() => { Task.Delay(1000).Wait(); return 1000;}),
                new Task<int>(() => { Task.Delay(3000).Wait();; return 3000;})
            };
            var result = tasks.Where(x => x.Wait(2000)).Select(x => x.Result).ToList();
            foreach (var i in result)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }


ожидал что вернется таска возвращающая 1000
...
Рейтинг: 0 / 0
skip task by timeout
    #39476815
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var tasks = new List<Task<int>> {
                Task.Run(() => { Task.Delay(5000).Wait(); return 5000;}) ,
                Task.Run(() => { Task.Delay(1000).Wait(); return 1000;}),
                Task.Run(() => { Task.Delay(3000).Wait();; return 3000;})
            };
            var result = tasks.Where(x => x.Wait(2000)).Select(x => x.Result).ToList();
            foreach (var i in result)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("done");
            Console.ReadKey();



Либо используй Unwrap в LINQ выражении.

Однако возвращается 2 значения, а не одно. Предлагаю подумать, почему так :)
...
Рейтинг: 0 / 0
skip task by timeout
    #39476817
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

если используешь Delay, можешь юзать await

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            var tasks = new List<Task<int>> {
                Task.Run(async () => { await Task.Delay(5000); return 5000;}) ,
                Task.Run(async () => { await Task.Delay(1000); return 1000;}),
                Task.Run(async () => { await Task.Delay(3000);; return 3000;})
            };
            var result = tasks.Where(x => x.Wait(2000)).Select(x => x.Result).ToList();
            foreach (var i in result)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
...
Рейтинг: 0 / 0
skip task by timeout
    #39476818
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

блин вот я балда и не написал Run(), хотя обычно в проде всегда пишу Task.Factory.StartNew, прям не внимательный. госпади я тебя люблю)


п.с. насчет результата да 2 ..сижу думаю почему так вроде не должны таски друг на друга влиять
...
Рейтинг: 0 / 0
skip task by timeout
    #39476836
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну почему 2 результата я понял, изза того что where накладывается по очереди. с полным ожиданием
...
Рейтинг: 0 / 0
skip task by timeout
    #39476947
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

А почему не использовать Task.WaitAll, WaitAny?
Можно написать более простую логику, чем при использовании этой жуткой linq-конструкции
...
Рейтинг: 0 / 0
skip task by timeout
    #39476953
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

ну а как ты сделаешь с ними мою задачу? вот у тебя есть несколько задач, они выполняются по разному времени, но тебе надо выкинуть задачи которые выполняются дольше чем указано т.е. их результат не нужен. к примеру есть 3 задачи: 1 выполняется 1 секунду, 2 - 3 секунды, 3 - 5 секунда. нужны результаты только задачи которые не больше 2 секунд. т.е. только первая задача в таких условиях. WaitAll - ждет все, WaitAny самую первую.
...
Рейтинг: 0 / 0
skip task by timeout
    #39477000
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

хм ты навел меня на идею спасибо или ты может эт и имел ввиду
Код: c#
1.
2.
3.
...
 Task.WhenAny(delay, Task.WhenAll(tasks)).Wait();          
 var result = tasks.Where(x=>x.IsCompleted).Select(x => x.Result).ToList(); 



таски с флагом IsCompleted как раз то что нужно будет, хотя есть шанс что пока будет обрабатываться линку какая то из таск может затесаться но эт уже не критично
...
Рейтинг: 0 / 0
skip task by timeout
    #39477009
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuну почему 2 результата я понял, изза того что where накладывается по очереди. с полным ожиданием

Ну да, если развернуть выражение, получится типа такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if(Task.Run(async () => { await Task.Delay(5000); return 5000;}).Wait(2000))
{
   Console.WriteLine(5000);
}
if(Task.Run(async () => { await Task.Delay(1000); return 1000;}).Wait(2000))
{
   Console.WriteLine(1000);
}
if(Task.Run(async () => { await Task.Delay(3000); return 3000;}).Wait(2000))
{
   Console.WriteLine(3000);
}



Ты верно заметил, что надо использовать фильтр IsCompleted, после ожидания в 2000 мс.
Ещё рекомендую поиграться с AsParallel()
...
Рейтинг: 0 / 0
skip task by timeout
    #39477010
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Если корректно, будет выглядеть это так:

Код: c#
1.
2.
3.
if ( task[0].Wait(2000) ) Console.WriteLine(task[0].Result);
if ( task[1].Wait(2000) ) Console.WriteLine(task[1].Result);
if ( task[2].Wait(2000) ) Console.WriteLine(task[2].Result);



А то в примере выше такси запускаются уже после ожидания
...
Рейтинг: 0 / 0
skip task by timeout
    #39477011
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
пробовал так но результат не стабильный на разных кейсах получился, не смог найти объяснения.
Код: c#
1.
var result = tasks.AsParallel().Where(x=>x.Wait(2000)).Select(x => x.Result).ToList();
...
Рейтинг: 0 / 0
skip task by timeout
    #39477012
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Ну вот верняк:

Код: c#
1.
2.
Task.Delay(2000).Wait();
var result = tasks.Where(x => x.IsCompeted).Select(x => x.Result).ToList();
...
Рейтинг: 0 / 0
skip task by timeout
    #39477014
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Для данной задачи AsParallel не подходит, так как результат тебе нужен в одном потоке и он зависит от всех элементов-задач. Но можно делать другие крутые штуки в области параллелизма :)
...
Рейтинг: 0 / 0
skip task by timeout
    #39477021
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Код: c#
1.
Task.Delay(2000).Wait();


эт вариант не много плох тем что всегда ждет 2 секунды.
а то что я написал сверху
Код: c#
1.
 Task.WhenAny(delay, Task.WhenAll(tasks)).Wait();


зайдет лучше если таски быстрее отработают чем 2 секунды
мелкий но профит )
...
Рейтинг: 0 / 0
skip task by timeout
    #39477026
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Ну таки да, согласен )
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / skip task by timeout
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]