2015-12-26 395 views
2

我有一个WCF服务,返回一个字符串的方法。无法将类型'System.Threading.Tasks.Task <String>'隐式转换为'字符串'

WCF服务:

public string selectName(int input) 
    { 
     string firstN, surN,result; 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT FirstName, Surname FROM tbUserAccounts WHERE StudentID = @ID", con); 
     cmd.Parameters.Add("@ID", System.Data.SqlDbType.Int).Value = input; 
     SqlDataReader reader = cmd.ExecuteReader(); 
     if (reader.Read()) 
     { 
      firstN= reader["FirstName"].ToString(); 
      surN = reader["Surname"].ToString(); 
      result = firstN + " " + surN; 
      con.Close(); 
      return result; 

     } 

     else 
     { 
      con.Close(); 
      return string.Empty; 
     } 

    } 

此方法适用于Web服务端。我尝试过使用WCFTest客户端并返回预期的值。 现在在应用程序端我试图使用这些值添加到我的静态类变量:

private void btnSignIn_Click_1(object sender, RoutedEventArgs e) 
    { 

     Login._name = ServiceClientObj.selectNameAsync(int.Parse(studentIdBox.Text)); 
     Frame.Navigate(typeof(WelcomePage)); 


    } 

的“ServiceClientObj.selectNameAsync(int.Parse(studentIdBox.Text));'是强调了与一个错误说

Cannot implicitly convert type 'System.Threading.Tasks.Task<String> to 'string' 

我不熟悉的WCF服务,所以我不完全了解有关使用异步的。

任何帮助或解释将不胜感激。谢谢。

回答

3

试试这样说:

private async void btnSignIn_Click_1(object sender, RoutedEventArgs e) 
{ 
    Login._name = await ServiceClientObj.selectNameAsync(int.Parse(studentIdBox.Text)); 
    Frame.Navigate(typeof(WelcomePage)); 
} 

异步方法selectNameAsync返回Task<string>这是怎样的一个承诺,将在未来返回string,等待您可以使用关键字await这个字符串的结果,但使用它的你的方法应该有async关键字。

或者您可以使用此方法selectName的同步版本,如果它也通过WCF生成的代码将是这样的:

private void btnSignIn_Click_1(object sender, RoutedEventArgs e) 
{ 
    Login._name = ServiceClientObj.selectName(int.Parse(studentIdBox.Text)); 
    Frame.Navigate(typeof(WelcomePage)); 
} 
+0

谢谢你,我说“等待”服务客户对象之前和工作正常!我没有尝试你提到的同步方法,但是我想问一下与异步方法相比它有多不同? – TeeHP

相关问题