2010-05-03 9 views
5

proxy_OpenRead पूर्ण विधि में वीआईपी तक कैसे पहुंचे?सिल्वरलाइट: वेबक्लिएंट असिंक्रोनस मोड का उपयोग कर प्रतिक्रिया से डेटा को कैसे पास किया जाए?

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

void proxy_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 

} 

उत्तर

3

इसमें दो दृष्टिकोण हैं। सबसे पहले स्ट्रिंग को OpenReadAsync कॉल में दूसरे पैरामीटर के रूप में पास करना है, यह पैरामीटर इवेंट तर्क की UserState संपत्ति का मान बन जाता है।

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. 
} 

एक और दृष्टिकोण सीधे एक बंद का उपयोग कर चर तक पहुँचने के लिए है: -

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

ध्यान रखें कि यदि async कॉलबैक विधि एक डेटाबाउंड चर में लिखते हैं, तो आप एक मिलने की संभावना है रहो क्रॉस-थ्रेड अपवाद। UI थ्रेड पर वापस जाने के लिए आपको BeginInvoke() का उपयोग करने की आवश्यकता होगी। डब्ल्यूसीएफ सेवाओं का उपयोग करके एक उदाहरण यहां दिया गया है, लेकिन सिद्धांत वही है।

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); 
    } 
} 
संबंधित मुद्दे