Silverlight:如何使用WebClient异步模式将数据从请求传递到响应?

5
如何在 proxy_OpenReadCompleted 方法中访问 VIP?
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个回答

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

请注意,如果异步回调方法写入数据绑定变量,则可能会出现跨线程异常。您将需要使用BeginInvoke()返回到UI线程。以下是使用WCF服务的示例,但原理相同。

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接