2011-06-07 39 views
0

我想等到异步WCF服务操作完成。怎么做 ?WCF异步方法:等到操作完成

Service.WebService.GetUserCompleted += new EventHandler<BGWebService.GetUserCompletedEventArgs>(WebService_GetUserCompleted); 
Service.WebService.GetUserAsync(UserId); 

回答

0

GetUserAsync应返回IAsyncResultsee MSDN documentation)的生成的方法。您可以使用它来阻止,直到操作完成:

IAsyncResult asyncResult = Service.WebService.GetUserAsync(UserId); 
asyncResult.AsyncWaitHandle.WaitOne(); 
+0

我已经尝试过了,但是我无法将GetUserAsync从无效类型转换为IAsyncResult – Tony 2011-06-07 18:52:35

+1

您使用的是为Silverlight生成的代理吗? – 2011-06-07 19:14:23

0

那么我试着以不同的方式做到这一点。我没有等待服务响应,而是打电话给我正在处理的界面。

public class Person : INotifyPropertyChanged 
{ 
    //Calling the service to get the object needed 
    private string personname 
     public string PersonName 
     { 
      get { 
       return personname; 
      } 
      set { 
       personname = value; 
       NotifyPropertyChanged("PersonName"); 
      } 
     } 

     private void NotifyPropertyChanged(string property) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void LoadMembersName() 
     { 
      ServiceSoapClient serviceClient = new ServiceSoapClient() {}; 
      serviceClient.GetMembersNameCompleted += (sender, e)=>{ 
      PersonName = e.Result 
     } ; 
    } 
} 

现在在界面上我们只需要加载人员的姓名并在属性更改事件触发后执行操作。

void Page_Load (object sender, EventArgs e) 
{ 
    Person per = new Person(); 
    per.PropertyChanged += (sender,e) => 
    { 
     //Your code here 
     Response.Write(per.PersonName); 
    }; 
    per.LoadMembersName(); 
} 

我真的很抱歉。我也从某个源复制了代码,但是我错误地链接了该链接。