2012-02-22 12 views
0

誰でも素晴らしいアイデアを知っていますか?結果をUIスレッドに返す方法は? 私はこのコードを書きましたが、非同期で "img"を返すことができないため、コンパイルエラーになります。Windows PhoneのUIスレッドに結果を返す方法は?

public byte[] DownloadAsync2(Uri address) 
{ 
    byte[] img; 
    byte[] buffer = new byte[4096]; 

    var wc = new WebClient(); 

    wc.OpenReadCompleted += ((sender, e) => 
    { 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      int count = 0; 
      do 
      { 
       count = e.Result.Read(buffer, 0, buffer.Length); 
       memoryStream.Write(buffer, 0, count); 
      } while (count != 0); 

      Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        if (e.Error == null) img = memoryStream.ToArray(); 
       }); 
     } 
    } 
    ); 
    wc.OpenReadAsync(address); 

    return img; //error : Use of unassigned local variable 'img' 
} 

答えて

2
にあなたの方法を変更し

public void DownloadAsync2(Uri address, Action<byte[]> callback, Action<Exception> exception) 
{ 
    var wc = new WebClient(); 

    wc.OpenReadCompleted += ((sender, e) => 
    { 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      int count = 0; 
      do 
      { 
       count = e.Result.Read(buffer, 0, buffer.Length); 
       memoryStream.Write(buffer, 0, count); 
      } while (count != 0); 

      Deployment.Current.Dispatcher.BeginInvoke(() => 
      { 
       if (e.Error == null) callback(memoryStream.ToArray()); 
       else exception(e.Error); 
      }); 
     } 
    } 
    ); 
    wc.OpenReadAsync(address); 
} 

使用法:(ラムダ式のない旧式のコード)

DownloadAsync2(SomeUri, (img) => 
{ 
    // this line will be executed when image is downloaded, 
    // img - returned byte array 
}, 
(exception) => 
{ 
    // handle exception here 
}); 

または:

DownloadAsync2(SomeUri, LoadCompleted, LoadFailed); 

// And define two methods for handling completed and failed events 

private void LoadCompleted(byte[] img) 
{ 
    // this line will be executed when image is downloaded, 
    // img - returned byte array 
} 

private void LoadFailed(Exception exception) 
{ 
    // handle exception here 
} 
+0

おかげでお返事。私は行動に精通していません。あなたはActionでUsageを使う方法を教えてくれますか? –

+0

あなたのコードにミスがあると思います。 "if(e.Error!= null)"は "if(e.Error == null)"でなければなりません。私は修正し、私はそれが働いたことを確認した。 –

+0

はい、ありがとう.... – Ku6opr

関連する問題