Поиск видео на YouTube асинхронно C # - PullRequest
0 голосов
/ 17 января 2010

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

http://google -gdata.googlecode.com / СВН / Docs / folder48 / Multithreadedoperations.html

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

Ответы [ 2 ]

2 голосов
/ 17 января 2010

Большинство API-интерфейсов WebService (особенно REST полных) не предоставляют асинхронный способ получения результатов, поскольку в целом они стараются не сохранять состояния: я считаю, что Youtube API не является исключением.

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

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

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

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

1 голос
/ 17 января 2010

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

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

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-формам или GTK работать так, чтобы это не выглядело как зависание. К сожалению, это боль в заднице. Что вы, вероятно, хотите сделать, это просто использовать фоновый работник. Прочтите эту часть ЗДЕСЬ и посмотрите, не поможет ли это вам больше, потому что у BackgroundWorkers могут быть обратные вызовы. Затем все, что вам нужно сделать, это настроить фонового работника, а затем подключить функцию обновления к завершенному событию.

...