0

YouTube Data API と C# は初めてです。ビデオを検索して結果をリストビューに表示したいのですが、非同期で実行できません。私は検索して多くのことを試みましたが、何もありませんでした。

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

私を助けてください。

4

2 に答える 2

2

ほとんどの WebService API (特にREST ful のもの) は、結果を取得するための非同期の方法を提供しません。一般に、それらはステートレスのままでいようとするためです: Youtube API も例外ではないと思います。

代わりに、次のいずれかのような、非同期リクエストをシミュレートするための従来の方法に頼る必要があります。

  • より小さなページ化されたリクエストを作成し、ユーザーが結果をスクロールして表示するものが残っていない場合にのみそれらを起動します。これは、各リクエストで行う作業が少なくなり、UI がロックされる可能性が低くなることを意味します。
  • これを行う場合でも、専用スレッドを使用して結果を取得し、UI の更新を担当するスレッドにフィードバックすることをお勧めします。これにより、サーバーの遅延に関係なく、UI の応答性が維持されます。
  • または、イベント ベースのフレームワーク (リアクター パターンを実装するフレームワーク) を使用して要求を行います。このようなフレームワークでは、リクエストを発行し、結果を含むコールバックを取得して、その間に他のことを行うことができます。このモデルでは、共有データ (スレッド化時に使用される) を保護するためのミューテックスの必要性と、(ほぼ間違いなく) 追加されたコールバック モデルの複雑さとをトレードオフします。

[編集: .NETの場合、reactor ベースのアプローチには適していない可能性があります]

この点に関して、YouTube に特別なことは何もありません。ほとんどの API から大きな結果セットを取得するときに、同じ手法を使用できます。

于 2010-01-17T09:51:10.760 に答える
1

非同期デリゲートを使用して、非同期呼び出しで非非同期メソッドをラップできませんか? 私の参照はこのリンクです。

わかりましたので、非同期呼び出しを次のようにしましたか...

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 がコールバックを持つことができるため、これが役に立たないかどうかを確認してください。あとは、バックグラウンド ワーカーをセットアップし、update 関数を completed イベントにフックするだけです。

于 2010-01-17T10:03:18.720 に答える