0

我是 YouTube 数据 API 和 C# 的新手。我想搜索视频并将结果显示到列表视图中,我做到了,但我不能异步进行。我已经搜索并尝试了很多,但最终一无所获。

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

请帮我。

4

2 回答 2

2

大多数 WebService API(尤其是REST API )不提供异步方式来检索结果,因为一般来说,它们试图保持无状态:我相信 Youtube API 也不例外。

相反,您将需要依靠传统方法来模拟异步请求,例如以下之一:

  • 提出更小的、分页的请求,并且仅在用户滚动浏览结果时才触发它们,而您没有任何东西可以显示。这意味着对每个请求要做的工作更少,您的 UI 也不太可能被锁定。
  • 即使您这样做,您也可能希望使用专用线程来处理获取结果并将它们反馈给负责更新 UI 的线程。这将确保您的 UI 保持响应,无论服务器的延迟如何。
  • 或者,使用基于事件的框架(实现反应器模式的框架)来发出请求。在这样的框架下,您可以触发请求并获得带有结果的回调,同时允许您做其他事情。在此模型下,您需要权衡互斥锁以保护共享数据(在线程化时使用)与(可能)增加的回调模型复杂性。

[编辑:对于 .NET,我认为这可能不是基于反应器的方法的理想候选者]

在这方面,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-forms 或 GTK 运行,使其看起来不会挂起。不幸的是,这是一个痛苦的屁股。您可能想要做的只是使用后台工作人员。在这里阅读这部分,看看这是否对您没有更多帮助,因为 BackgroundWorkers 可以有回调。然后你所要做的就是设置一个后台工作者,然后将你的更新函数挂接到完成的事件中。

于 2010-01-17T10:03:18.720 回答