2010-01-17 65 views
0

我是YouTube Data API和C#的新手。我想搜索視頻並將結果顯示到列表視圖中,但我做到了,但我無法異步執行此操作。我搜索並嘗試了很多,但沒有結果。異步搜索Youtube視頻C#

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

請幫助我。

+0

你是什麼意思的異步?與客戶端異步或與服務器異步?這是兩個完全不同的東西。也就是說,你是想爲用戶製作一個更快捷/更時尚的應用體驗,還是試圖節省服務器資源? – Eilon

回答

2

大多數WebService API(尤其是REST ful)不提供異步方式來檢索結果,因爲通常他們會嘗試保持無狀態:我相信Youtube API也不例外。

相反,你將需要在傳統的方法瘦模擬異步請求,以下等爲一體:

  • 做更小,尋呼請求,只解僱他們斷爲你的用戶滾動瀏覽結果你沒有留下來顯示。這意味着每個請求的工作量會減少,並且您的UI將不太可能鎖定。
  • 即使您這樣做,您也可能想要使用專用線程來負責獲取結果並將它們反饋給負責更新UI的線程。這將確保您的UI保持響應,無論服務器的延遲如何。
  • 或者,使用基於事件的框架(實現reactor pattern的框架)來發出請求。在這樣的框架下,您可以發出請求並獲得結果回調,從而讓您在此期間做其他事情。在這種模式下,您不需要使用互斥鎖來保護共享數據(在線程中使用)與回調模型的複雜性(可以說)增加相抵觸。

[編輯:爲.NET我看到might not be such a good candidate for the reactor based approach]

沒有什麼特別之處的YouTube在這方面的:從最API的讀取大型結果集時可能會採用相同的技術。

1

不能在異步調用中使用異步委託包裝任何非異步方法嗎?我的參考是這個link

確定這樣做了,你讓你的異步調用這樣的事情...

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運行,使其看起來不像掛起。不幸的是,這是一個令人頭疼的問題。你可能想要做的只是使用後臺工作者。閱讀這部分HERE,看看這是否對你沒有幫助,因爲BackgroundWorkers可以有回調。然後,您只需設置一個後臺工作人員,然後將更新函數掛接到完成的事件中。

+0

我用它,但操作仍滯後的應用程序:(。 –