异步WebMethod调用后更新UI

问题描述:

问候!异步WebMethod调用后更新UI

我有一个WebService,它包含一个WebMethod,它执行一些工作并返回一个布尔值。它所做的工作可能需要或不需要一些时间,所以我想要异步调用它。

[WebService(Namespace = "http://tempuri.com/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
public class MyWebSvc : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public bool DoWork() 
    { 
     bool succ = false; 

     try 
     { 
      // do some work, which might take a while 
     } 
     catch (Exception ex) 
     { 
      // handle 
      succ = false; 
     } 

     return succ;   
    } 
} 

此WebService存在于Web场中的每个服务器上。于是打电话给每台服务器上的DoWork()方法,我有一个类库这样做,基于服务器的URL列表上:

static public class WebSvcsMgr 
{ 
    static public void DoAllWork(ICollection<string> servers) 
    { 
     MyWebSvc myWebSvc = new MyWebSvc(); 

     foreach (string svr_url in servers) 
     { 
      myWebSvc.Url = svr_url; 
      myWebSvc.DoWork(); 
     } 
    } 
} 

最后,这是从一个asp的Web界面称为:按钮单击像这样的事件:

WebSvcsMgr.DoAllWork(server_list); 

对于Web窗体称为静态DoAllWork()方法,我打算让这个通过IAsyncResult的异步调用。但是,我希望报告DoWork()WebMethod成功/失败,以便返回结果。与UpdatePanel结合的最佳方法是什么?一个GridView?标签?而且这怎么可能由静态助手类返回到Web窗体?

在条件更新面板中的字面值会很好。

<asp:UpdatePanel ID="up" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
    <asp:Literal ID="litUpdateMe" runat="server" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 
+0

从WebSvcsMgr.DoAllWork()异步调用MyWebSvc.DoWork(),还是从Web窗体异步调用WebSvcsMgr.DoAllWork()会更有意义? – Bullines 2008-09-30 17:12:50

Asynchronous pages在您需要异步调用Web服务方法的场景中很有用。