2015-12-26 393 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

相關問題