RIA サービスで使用されるイベント非同期プログラミング モデルをタスクにラップしようとしています。
TaskCompletionSource を使用する標準的な方法に従い、次の拡張メソッドを実装しました。
public static Task<IEnumerable<T>> LoadAsync<T>(this DomainContext source, EntityQuery<T> query) where T : Entity
{
TaskCompletionSource<IEnumerable<T>> taskCompletionSource = new TaskCompletionSource<IEnumerable<T>>();
source.Load(
query,
loadOperation =>
{
if (loadOperation.HasError && !loadOperation.IsErrorHandled)
{
taskCompletionSource.TrySetException(loadOperation.Error);
loadOperation.MarkErrorAsHandled();
}
else if (loadOperation.IsCanceled)
{
taskCompletionSource.TrySetCanceled();
}
else
{
taskCompletionSource.TrySetResult(loadOperation.Entities);
}
},
null);
return taskCompletionSource.Task;
}
次に、これを次のように使用します。
var task = _context.LoadAsync(_context.GetPlayersQuery());
task.Start();
task.Result;
ただし、問題は、「約束スタイルのタスクで Start が呼び出されない可能性がある」という InvalidOperationException が発生することです。タスクを開始しないようにしましたが、loadOperation コールバックが起動しません。
ここで私が間違っていることを誰かが見ることができますか?
前もって感謝します