Вопрос

Я новичок в API данных YouTube, а также в C#.Я хочу выполнить поиск по видео и отобразить результат в виде списка, и я это сделал, но не могу сделать это асинхронно.Я много искал и пробовал, но в итоге ничего не нашел.

http://google-gdata.googlecode.com/svn/docs/folder48/Multithreadedoperations.html

Пожалуйста, помогите мне.

Это было полезно?

Решение

Большинство API веб-сервисов (особенно ОТДЫХполные) не предоставляют асинхронного способа получения результатов, поскольку, как правило, они стараются оставаться без сохранения состояния:Я считаю, что API Youtube не является исключением.

Вместо этого вам придется полагаться на традиционные методы моделирования асинхронных запросов, например один из следующих:

  • Создавайте небольшие постраничные запросы и запускайте их только тогда, когда ваши пользователи просматривают результаты, а у вас не остается ничего для отображения.Это означает, что для каждого запроса требуется меньше работы, и вероятность блокировки вашего пользовательского интерфейса будет меньше.
  • Даже если вы это сделаете, вы можете захотеть использовать выделенный поток, который будет получать результаты и передавать их обратно в поток, отвечающий за обновление вашего пользовательского интерфейса.Это гарантирует, что ваш пользовательский интерфейс будет оставаться отзывчивым независимо от задержки сервера.
  • В качестве альтернативы используйте платформу, основанную на событиях (структуру, которая реализует модель реактора), чтобы сделать запросы.В таких рамках вы отправляете запрос и получаете обратный вызов с результатами, что позволяет вам тем временем заниматься другими делами.В этой модели вы компенсируете необходимость использования мьютексов для защиты общих данных (используемых при потоковой передаче) с (возможно) дополнительной сложностью модели обратного вызова.

[редактировать:для .NET я вижу это может быть не таким уж хорошим кандидатом для подхода на основе реактора]

В YouTube в этом плане нет ничего особенного:вы можете использовать те же методы при получении больших наборов результатов из большинства API.

Другие советы

Не можете ли вы обернуть любой неасинхронный метод в асинхронный вызов, используя асинхронные делегаты?Моя ссылка это связь.

Хорошо. Итак, вы сделали свой асинхронный вызов примерно таким...

private delegate <returnType> YouTubeAPI( <args> )
private YouTubeAPI func;
private IAsyncResult ticket;

void YouTubeSearchFunc( string what )
{
    func = <whatever the you tube call is>
    ticket = func.BeginInvoke( <args needed> );
    // WE MUST do this in order to return flow of control to program
    return;
}

// later we need to check if the ticket is done and then get it
if ( ticket.IsComplete == true )
    // get it
else
    // continue on like normal

Причина, по которой мы не можем сразу получить значение, заключается в том, что это заблокирует программу.Это именно то, чего мы не хотим делать.Поэтому вместо этого нам нужно структурировать программу таким образом, чтобы мы могли проверять, выполняется ли она в отдельном обновлении.Это позволяет Win-forms или GTK работать так, чтобы не было похоже, что они зависают.К СОЖАЛЕНИЮ, это боль в заднице.Вероятно, вы захотите просто использовать фонового работника.Прочтите эту часть ЗДЕСЬ и посмотрите, не поможет ли это вам больше, потому что у BackgroundWorkers могут быть обратные вызовы.Затем все, что вам нужно сделать, это настроить фонового работника, а затем подключить функцию обновления к завершенному событию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top