2012-02-22 2 views
0

ここに私が今では明らかに機能しない機能があります。それがうまくいかない理由は、WebClientが非同期であり、dataが空になってからWebClientによって満たされ、XMLリーダーでクラッシュするためです。この関数内でWebClientを呼び出すにはどうしたらいいですか?外部イベントハンドラを必要とするかどうかにかかわらず、必要に応じてServerResultを返します。WebClientを呼び出す戻り値を必要とする関数を呼び出すにはどうすればよいですか?

static public ServerResult isBarcodeCorrectOnServer(string barcode) 
{ 
      Dictionary<string, IPropertyListItem> dict = configDictionary(); 

      string urlString = (string.Format("http://www.myurl.com/app/getbarcodetype.php?realbarcode={0}&type={1}", barcode, dict["type"])); 

      WebClient wc = new WebClient(); 
      string data = ""; 
      wc.DownloadStringCompleted += (sender, e) => 
      { 
       if (e.Error == null) 
       { 
        //Process the result... 
        data = e.Result; 
       } 
      }; 
      wc.DownloadStringAsync(new Uri(urlString)); 

      StringReader stream = new StringReader(data); 
      var reader = XmlReader.Create(stream); 
      var document = XDocument.Load(reader); 
      var username = document.Descendants("item"); 
      var theDict = username.Elements().ToDictionary(ev => ev.Name.LocalName, ev => ev.Value); 

      if (theDict.ContainsKey("type") == true && theDict["type"].ToString() == dict["type"].ToString()) 
      { 
       return ServerResult.kOnServer; 
      } 
      else if (theDict.ContainsKey("type") == true) 
      { 
       return ServerResult.kWrongType; 
      } 
      else 
      { 
       return ServerResult.kNotOnServer; 
      } 
     } 
+0

なぜ非同期バージョンのDownloadStringを使用しないのですか? – MarcinJuraszek

+3

Silverlightは非同期をサポートしていません – BrokenGlass

答えて

5

することはできません「ハック」のない、あなたはいけません - 非同期を採用し、ダウンロードが完了すると、実行させたいデリゲートに渡す:

static public void isBarcodeCorrectOnServer(string barcode, Action<string> completed) 
{ 
    //.. 
    wc.DownloadStringCompleted += (sender, e) => 
    { 
     if (e.Error == null) 
     { 
      //Process the result... 
      data = e.Result; 
      completed(data); 
     } 
    }; 
    //.. 
} 

あなたが移動することができますすべての処理コードをダウンロードして別の方法で呼び出すことができます。

+0

デリゲートを渡すことは私が知る必要があったことです。ありがとう! –

0

基本的にはできません。または、少なくともあなたはすべきではありません。あなたは、同期化 IOのために設計されたプラットフォーム上で同期に設計された方法を持っています。

基本的には、プラットフォームで動作するようにコードを設計する必要があります。それがになり、が非同期であることに同意し、それを呼び出しコードで処理します。 C#5が出てくると、それがWindowsの携帯電話でサポートされていたときに、このすべてがasyncを使用してたくさん単純になることを

注意。メソッドからTask<ServerResult>を返し、WebClientの結果をawait返します。あなたが楽しみのために開発しているだけなので(いくつかのバグがあり、マーケットプレイスアプリケーションのためには有効でないかもしれないCTPでの作業は気にしないでください)、do that todayです。

関連する問題