2015-05-17 25 views
0

我有一個做了很多的電話像轉換標準適用於WP8與Web客戶端

string html = getStringFromWeb(url); 
//rest of processes use the html string 

我試圖讓應用程序到Windows Phone的應用程序,並且該方法似乎是完全不同的:

void perform asynch call (...) 

void handler 
{ string html = e.Result 
    //do things with it 
} 
  1. 從網頁只可能使用這種非同步方法得到的HTML?
  2. 如何重新使用代碼,以便我可以在使用html時使用它?
+1

您是否嘗試過使用異步API?至少發佈你的'getStringFromWeb'方法調用。 –

+1

使用HttpClient和async/await關鍵字,可以編寫非常類似於編寫同步代碼的異步代碼。它會爲您節省很多時間來轉換您的代碼 –

+0

感謝關鍵字KooKiz,這是我正在尋找的解決方案。 – donkz

回答

1

異步方法返回Task。如果您不使用Wait(),代碼會繼續執行超過異步方法。如果您不想使用Wait(),則可以使用Callback -method作爲參數創建異步方法。

有等待(注):

// Asynchronous download method that gets a String 
public async Task<string> DownloadString(Uri uri) { 
    var task = new TaskCompletionSource<string>(); 

    try { 
     var client = new WebClient(); 
     client.DownloadStringCompleted += (s, e) => { 
     task.SetResult(e.Result); 
    }; 

    client.DownloadStringAsync(uri); 
    } catch (Exception ex) { 
     task.SetException(ex); 
    } 

    return await task.Task; 
} 

private void TestMethod() { 
    // Start a new download task asynchronously 
    var task = DownloadString(new Uri("http://mywebsite.com")); 

    // Wait for the result 
    task.Wait(); 

    // Read the result 
    String resultString = task.Result; 
} 

或者有回調:

private void TestMethodCallback() { 

    // Start a new download task asynchronously 
    DownloadString(new Uri("http://mywebsite.com"), (resultString) => { 
     // This code inside will be run after asynchronous downloading 
     MessageBox.Show(resultString); 
    }); 

    // The code will continue to run here 
} 

// Downlaod example with Callback-method 
public async void DownloadString(Uri uri, Action<String> callback) { 

    var client = new WebClient(); 
    client.DownloadStringCompleted += (s, e) => { 
     callback(e.Result); 
    }; 

    client.DownloadStringAsync(uri); 
} 

當然我建議使用回調的方式,因爲它沒有阻止代碼在下載String時運行。

+0

謝謝!我會盡快嘗試。 – donkz

1

無論何時你正在爲Web請求工作去HttpWebRequest。

在windows phone 8 xaml/runtime中,您可以使用HttpWebRequest或WebClient來完成。

基本上WebClient是HttpWebRequest的一個包裝。

如果你有一個小的請求,然後用戶HttpWebRequest。它是這樣的

HttpWebRequest request = HttpWebRequest.Create(requestURI) as HttpWebRequest; 
WebResponse response = await request.GetResponseAsync(); 
ObservableCollection<string> statusCollection = new ObservableCollection<string>(); 
using (var reader = new StreamReader(response.GetResponseStream())) 
{ 
    string responseContent = reader.ReadToEnd(); 
    // Do anything with you content. Convert it to xml, json or anything. 
} 

你可以在一個基本上是異步方法的函數中做到這一點。

即將到來的第一個問題,所有的Web請求將作爲異步調用,因爲它需要時間來下載基於您的網絡。爲了使應用程序不被凍結,將使用異步方法。

+0

Thx的答案,但你基本上給不完整的代碼,並說要堅持異步的方法,以問一個人的異步方法的性質。不完全有用。 – donkz

+1

@donkz無論如何你得到了答案。我現在不需要編輯。 – Mani