2012-02-22 66 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 
}); 

或(不lambda表达式旧式代码):

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 。你会告诉我如何在使用中使用Action吗? – 2012-02-23 14:07:52

+0

我想你的代码中有一个小姐。 “if(e.Error!= null)”应该是“if(e.Error == null)”。我修好了,我确认了它的工作。 – 2012-02-24 16:26:40

+0

是的,谢谢.... – Ku6opr 2012-02-24 18:47:35

相关问题