2013-09-30 16 views
0

採取以下代碼的結果有什麼用:如果我想返回的WebClient

public async Task<string> AuthenticatedGetData(string url, string token) 
    { 
     WebClient client = new WebClient(); 
     client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(WebClient_DownloadStringCompleted); 
     client.DownloadStringAsync(new Uri(url + "?oauth_token=" + token)); 
    } 

    private void WebClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     string response = e.Result;  
    } 

WebClient_DownloadStringCompleted被稱爲...和響應=我要回應......大。完美...

現在考慮如何我調用此方法AuthenticatedGetData:

它正在從一種存儲庫的名爲...的倉庫想要一個字符串,以便它可以序列化和做的東西與由此產生的對象...

因此,一切都從倉庫運行異步...調用authenticatedgetdata,然後發出請求...但因爲下載字符串沒有.Result()法因downloadstringcompleted需要void方法來調用...我不能結果字符串返回到調用庫。

什麼,我必須做的就是client.DownloadStringAsync返回上完成的響應串任何想法?

難道我只是單純地要緊密結合我的數據訪問操作這個特定的應用程序。它似乎很un..re可用:(我真的想繼續我的整個身份驗證的東西全部從什麼會分開發生。我不想不停地重複每個倉庫上面的代碼,因爲這將是爲每個相同反正!

編輯:: //

我創建了一個抽象方法在我的課,與上述要求涉及......然後我用我的倉庫擴展這個類,並實現抽象方法。聽起來不錯?

編輯:根據要求//調用代碼:

public class OrganisationRepository 
{ 
    PostRequest postRequest; 

    public OrganisationRepository() 
    { 
     this.postRequest = new PostRequest(); 
    } 
    public IEnumerable<Organisation> GetAll() 
    { 
     string requestUrl = BlaBla.APIURL + "/org/"; 
     string response = postRequest.AuthenticatedGetData(requestUrl, BlaBla.Contract.AccessToken).Result; 
    } 
} 

public class PostRequest 
{ 

    public Task<string> AuthenticatedGetData(string url, string token) 
    { 

     TaskCompletionSource<string> tcs = new TaskCompletionSource<string>(); 

     WebClient client = new WebClient(); 
     client.DownloadStringCompleted += (sender, e) => 
     { 
      if (e.Error != null) 
      { 
       tcs.TrySetException(e.Error); 
      } 
      else if (e.Cancelled) 
      { 
       tcs.TrySetCanceled(); 
      } 
      else 
      { 
       tcs.TrySetResult(e.Result); 
      } 
     }; 
     client.DownloadStringAsync(new Uri(url + "?oauth_token=" + token)); 
     return tcs.Task; 
    } 
} 

回答

1

我不知道什麼窗戶電話-8的限制是有關於這一點。但我認爲這應該工作。

public Task<string> AuthenticatedGetData(string url, string token) 
    { 
     TaskCompletionSource<string> tcs = new TaskCompletionSource<string>(); 

     WebClient client = new WebClient(); 
     client.DownloadStringCompleted += (sender, e) => 
     { 
      if (e.Error != null) 
      { 
       tcs.TrySetException(e.Error); 
      } 
      else if (e.Cancelled) 
      { 
       tcs.TrySetCanceled(); 
      } 
      else 
      { 
       tcs.TrySetResult(e.Result); 
      }    
     }; 
     client.DownloadStringAsync(new Uri(url + "?oauth_token=" + token)); 
     return tcs.Task; 
    } 

您可能也有能與此脫身(不知道這是否適用於Windows 8手機)

public Task<string> AuthenticatedGetData(string url, string token) 
    { 
     WebClient client = new WebClient(); 
     return client.DownloadStringTaskAsync(new Uri(url + "?oauth_token=" + token)); 

    } 
+0

不幸的是,請求只是永遠不會返回/完成...但不會出錯。 – Jimmyt1988

+0

你能顯示呼叫代碼嗎? – Erick

+0

我將它添加到OP中,感謝您的持續幫助!我所做的抽象事情並沒有解決任何問題......我想只是讓存儲庫返回字符串,然後序列化 – Jimmyt1988

0

一種解決方案是不是在所有使用Web客戶端庫。這裏的問題:你正在等待你的異步AuthenticatedGetData任務,但不起任何作用,因爲工作中沒有任何的await調用意味着它會立即結束。調用任務上的.result將始終爲空,因爲您永遠無法返回該方法中的值。在發生DownloadCompleted事件後,WebClient依賴於調用函數調用。但是,任何人都無法確切地知道何時發生這種情況,除非他們還訂閱了DownloadCompleted事件處理程序,這很愚蠢。我建議讓使用的HttpWebRequest http://blogs.msdn.com/b/andy_wigley/archive/2013/02/07/async-and-await-for-http-networking-on-windows-phone.aspx好運真正的異步Web請求服務。

+0

謝謝,我會看看,看看我能否得到它的工作。我離開這個話題有一段時間要仔細研究一下MVVM和數據綁定,現在回到了我需要從外部API獲取內容的這一點。 – Jimmyt1988

+0

這看起來很棒!如果它有效,我可能不得不擁抱你。 – Jimmyt1988

相關問題