我正在尝试将 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;
但问题是我收到一个 InvalidOperationException 说明“可能不会在承诺式任务上调用 Start”。我试过不启动任务,但是 loadOperation 回调永远不会触发。
谁能看到我在这里做错了什么?
提前致谢