Должен ли я использовать Task.Wait ()? - PullRequest
0 голосов
/ 11 октября 2018

Должен ли я использовать taskThatReturns.Wait() в приведенном ниже коде или я могу опустить его, поскольку, согласно моему пониманию, taskThatReturns.Result все равно будет ждать.

Task<string> taskThatReturns = new Task<string>(MethodThatReturns);
taskThatReturns.Start();
taskThatReturns.Wait();
Console.WriteLine(taskThatReturns.Result);

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Вызов Wait() перед доступом к Result не требуется.

Проверка ссылочного кода Task и Task<TResult> показывает, чтои метод void Wait(), и метод получения свойства Result в конечном итоге попадают в метод, который выполняет фактическое ожидание:

internal bool InternalWait(int millisecondsTimeout, CancellationToken cancellationToken)

Оба пути кода отправляют идентичные значения параметров в InternalWait - бесконечномаркер ожидания и отмены по умолчанию.

Если вы вызовете Wait перед доступом к Result, путь к коду внутри получателя, ведущий к InternalWait, будет пропущен, поскольку известно, что задача выполнена.Тем не менее, чистый результат останется неизменным в обоих случаях.

Примечание: В этом ответе намеренно игнорируются возможности оптимизации фрагмента кода.

0 голосов
/ 11 октября 2018

Чтобы ответить на актуальный вопрос.Вам либо нужно подождать, чтобы получить результаты, либо сделать то, что предложил Панагиотис Канавос, и дождаться задания.Вы слишком усложняете многопоточность, что является общей проблемой со всеми плохими примерами.

0 голосов
/ 11 октября 2018

Если вы все еще хотите использовать Task, лучше использовать следующий подход:

var result = taskThatReturns.GetAwaiter().GetResult();
0 голосов
/ 11 октября 2018
async void DoTask() {
  string task = await returnString();
  Console.WriteLine(task);
}

Task<string> returnString() {
  // you code here
}

Вы можете использовать асинхронный метод для ожидания выполнения Задачи

...