2010-05-03 15 views

cevap

3

Bunun iki yaklaşımı vardır. İlk olarak, dizeyi OpenReadAsync çağrısında ikinci parametre olarak geçirmek, bu parametre olay hatalarının UserState özelliğinin değeri olur.

void method1() 
{ 
    String VIP = "test"; 
    WebClient proxy = new WebClient(); 
    proxy.OpenReadCompleted += proxy_OpenReadCompleted; 
    String urlStr = "someurl/lookup?q=" + keyEntityName + "&fme=1&edo=1&edi=1"; 
    proxy.OpenReadAsync(new Uri(urlStr, UriKind.Relative), VIP); 
}  

void proxy_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    String VIP = (string)e.UserState; 
    // Do stuff that uses VIP. 
} 

başka bir yaklaşım doğrudan bir kapatma kullanarak değişken erişmektir: -

void method1() 
{ 
    String VIP = "test"; 
    WebClient proxy = new WebClient(); 
    proxy.OpenReadCompleted += (s, args) => 
    { 
     // Do stuff that uses VIP. 
    } 
    String urlStr = "someurl/lookup?q=" + keyEntityName + "&fme=1&edo=1&edi=1"; 
    proxy.OpenReadAsync(new Uri(urlStr, UriKind.Relative), VIP); 
}  
1
void method1() 
{ 
    String VIP = "test"; 
    WebClient proxy = new WebClient(); 
    proxy.OpenReadCompleted += (s,e) => proxy_OpenReadCompleted(s,e,VIP); 
    String urlStr = "someurl/lookup?q=" + keyEntityName + "&fme=1&edo=1&edi=1"; 
} 
0

zaman uyumsuz geri arama yöntemi bir veri sınırlama değişken içine yazıyor, sen bir alma olasılığı olduğunu unutmayın çapraz iş parçacığı istisnası. Kullanıcı Arabirimi iş parçacığına geri dönmek için BeginInvoke() kullanmanız gerekir. İşte WCF servislerini kullanan bir örnek, ama prensip aynı.

public void examsCallback(IAsyncResult result) 
{ 
    try 
    { 
     EntityList<ExamEntity> examList = ((IExamService) result.AsyncState).EndGetAllExams(result); 
     Deployment.Current.Dispatcher.BeginInvoke(() => 
     { 
      foreach (ExamEntity exam in examList) 
      { 
       Exams.Add(exam); 
      } 
      ItemCount = Exams.Count; 
      TotalItemCount = Exams.ItemCount; 
     }); 
    } 
    catch (Exception ex) 
    { 
     ErrorHandler.Handle(ex); 
    } 
}