2

文字列を返すメソッドを備えた WCF サービスがあります。

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 サービスに精通していないため、非同期の使用について完全には理解していません。

ヘルプや説明をいただければ幸いです。ありがとうございました。

4

1 に答える 1

4

次のようにしてみてください。

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

Async メソッドは、将来的に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));
}
于 2015-12-26T22:42:49.703 に答える