Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2016, 15:18   #1
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию Вопрос по Task.Wait();

Собственно вопрос вот в чем: в книге есть пример по получению результатов из задач. Вот он:
Код:
class Program
    {
        private static Tuple<int, int> TaskWithResult(object division)
        {
            Tuple<int, int> div = (Tuple<int, int>)division;
            int result = div.Item1 / div.Item2;
            int reminder = div.Item1 % div.Item2;
            Console.WriteLine("task creates a result...");
            return Tuple.Create<int, int>(result, reminder);
        }

        static void Main(string[] args)
        {
            var t1 = new Task<Tuple<int, int>>(TaskWithResult, Tuple.Create<int, int>(8, 3));
            t1.Start();
            Console.WriteLine(t1.Result);
            t1.Wait();
            Console.WriteLine("result from task: {0} {1}", t1.Result.Item1, t1.Result.Item2);
            Console.ReadLine();
        }
    }
И что-то я не совсем могу понять что здесь делает t1.Wait(); согласно MSDN это функция ожидает конца выполнения таска. Только вот дело в том, что если его закоментить; вставить в скобки вэйта 10, а в таске слип на 1000, то это никак не влияет на работу программы и выдает он строки
Код:
Console.WriteLine(t1.Result);
Console.WriteLine("result from task: {0} {1}", t1.Result.Item1, t1.Result.Item2);
на консоль в одно и тоже время (после завершения таска). Объясните недалекому, в чем тут прикол, и на кой вэйт его сюда впихнули.
max_prorok вне форума Ответить с цитированием
Старый 09.06.2016, 15:49   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так TaskWithResult ничего долгого не делает, вот и успевает и за 1000 мс, и за 10.
Но вообще обычно вы не можете знать сколько времени займет работа.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.06.2016, 16:00   #3
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так TaskWithResult ничего долгого не делает, вот и успевает и за 1000 мс, и за 10.
Но вообще обычно вы не можете знать сколько времени займет работа.
Так в том-то и дело. Что я специально увеличивал время работы TaskWithResult с помощью Thread.Sleep(5000).
Если я правильно понял MSDN, то в t1.Wait() в скобки могу поставить целое число миллисекунд, какое стоит ждать t1. Если t1 за это время не выполняется, то код выполняется дальше. Но на практике получается так, что код, следующий за t1.Start() все равно ожидает выполнения t1, и только после этого выводит обе строки на экран. Если это представить во временной области (со слипом в 5000 и вэйтом в 10), то получается следующим образом:
0 с. - task creates a result...
5 с. - (2, 2)
5 с. - result from task: 2 2
То есть на t1.Wait() программе в принципе все равно. Что он есть, что его нет.
max_prorok вне форума Ответить с цитированием
Старый 09.06.2016, 16:10   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А, да, видимо автор запутался в своем искусственном примере.
Result ждет завершения.

Но обычно таски не так используют.
И еще через new + Start вроде их не стоит создавать, но я не помню почему, гугл помнит.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.06.2016, 16:28   #5
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Под автором вы подразумеваете меня или автора книги?

P.S. Кажется, я начинаю понимать зачем автор воткнул этот Wait() туда. В тексте он пишет, что Result блокируется до тех пор, пока задача не будет завершена. И вот с целью показать это, он и воткнул туда Wait(). Мол смотрите, пока Result не разблокируется, ничего не увидете. Или же просто очепятка в книге, и надо было t1.Wait(); поставить сразу после t1.Start();. Это как минимум логично. Запустили задачу - ждем ее выполнения - считываем результаты.
P.P.S. На всякий случай заглянул в английское издание. Мало ли чего наши могут написать, тем более натыкался уже на очепятки в листинге в русском издании. Но нет, в английском издании листинг такой же.

Последний раз редактировалось max_prorok; 09.06.2016 в 16:49.
max_prorok вне форума Ответить с цитированием
Старый 09.06.2016, 16:43   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

книги.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
тестовый вопрос структура Task KVANTA Помощь студентам 4 16.01.2015 19:39
Вопрос по Task.Factory.StartNew Gregor C# (си шарп) 4 17.11.2014 20:05
wait, notifyAll --Serega-- Общие вопросы по Java, Java SE, Kotlin 1 20.12.2011 10:12
ошибка lock conflict on no wait transaction пауэрлифтинг БД в Delphi 1 28.05.2010 00:19