タイトルで説明しようとしたように、サービス参照を追加すると、Begin メソッドと End メソッドが取得されません。GetStudentsAsync() メソッドを取得しますが、待機できるようにしたいと考えています。
インターフェイスはシンプルです。
[ServiceContract]
public interface ISchoolLightService
{
[OperationContract]
ObservableCollection<SLUser> GetStudents();
[OperationContract]
ObservableCollection<SLUser> GetTeachers();
}
GetStudents は次のようになります。
public ObservableCollection<SLUser> GetStudents()
{
var users = (from u in ent.Users
where u.UserType == "Student"
select new SLUser
{
UserID = u.UserID,
...
});
return new ObservableCollection<SLUser>(users);
}
クライアントは Silverlight 5 プロジェクトで、サーバーは .NET 4.5 クラス ライブラリです。これらのメソッドを取得する必要はありませんか?
おそらく言及する価値があるのは、「常にメッセージ コントラクトを生成する」と「参照されたアセンブリで型を再利用する」のチェックを外す必要があることです。
編集: オブジェクト ブラウザを見ると、メソッドはそこにあるようですが、非公開です! なんで?この動作を変更するにはどうすればよいですか?
EDIT2:「Silverlight プロジェクトでタスクベースの操作を有効にするにはどうすればよいですか?」という質問の方が適切なようです。これは不可能のようです。私が見つけた回避策は、(別のデータコンテキストを使用して)の行に沿ったもののようです:
public static Task<ObservableCollection<Customer>> GetCustomers()
{
var tcs = new TaskCompletionSource<ObservableCollection<Customer>>();
var client = new CustomerServiceClient();
client.GetCustomersCompleted += (s,e) =>
{
if (e.Error != null)
tcs.TrySetException(e.Error);
else if (e.Cancelled)
tcs.TrySetCanceled();
else
tcs.TrySetResult(e.Result);
};
client.GetCustomersAsync();
return tcs.Task;
}
これは本当にそれを行う(唯一の)方法ですか?