我有一个我需要连接的服务,通过这样的动作传回数据:
public Guid UpdateEntities<T>(Action<EntitiesChangedResponse<T>> onResponse, IEnumerable<T> entities)
{
//Get some data
onResponse.Invoke(response);
{
现有代码将按如下方式调用服务:
Guid requestId = _productService.UpdateEntities<Product>(x => OnEntitiesUpdated(x), new List<Product> { updateProduct1, updateProduct2 });
回调将在未来的某个时刻对结果做一些事情:
private void OnEntitiesUpdated<T>(EntitiesChangedResponse<T> response)
{
//Do something with the result
}
我尝试将它与基于任务的信号R hub集成,因此需要将操作作为打字任务返回,但我不能为我的生活弄清楚如何实现这一点(我很新任务,所以请告诉我这是否是愚蠢的。)
它看起来像这样:
public Task<EntitiesChangedResponse<Product>> UpdateProducts(List<Product> products)
{
//Somehow wrap this in a task
Task<EntitiesChangedResponse<Product>> result = New Task<EntitiesChangedResponse<Product>>( call the product service );
return result;
}
任何帮助表示赞赏。这伤害了我的头脑。
答案 0 :(得分:2)
在&#34;回调&#34;之间架起一座桥梁。您可以使用基于API和任务的API TaskCompletionSource
public Task<EntitiesChangedResponse<Product>> UpdateProducts(List<Product> products)
{
var tcs = new TaskCompletionSource<EntitiesChangedResponse<Product>>();
_productService.UpdateEntities<Product>(response => tcs.SetResult(response), new List<Product> { updateProduct1, updateProduct2 });
return tcs.Task;
}
答案 1 :(得分:1)
让我们看看以下方法:
public Task<EntitiesChangedResponse<T>> UpdateEntities<T>(IEnumerable<T> entities)
{
var updateTask = Task.Run(()=>
{
//return data from this lambda expression
});
return updateTask;
}
这会启动并返回执行您工作的任务。
(如果你真的需要GUID,你可以返回一个元组或包含两者的任何DTO)。
现在您有几个选项可以使用此任务,其中一个是:
private Task async UpdateEntitiesAsync<T>(IEnumerable<T> entities)
{
try
{
EntitiesChangedResponse<T> response = await UpdateEntities(entities);
//asynchronous callback implementation code can go here
}
catch(AggregateException ex)
{
//handle a thrown exception
}
}
请注意:
1)一旦任务完成,执行将继续超过'await'语句,并将执行以下LOC。
2)如果任务发生故障(抛出异常),则不会执行超过await块的LOC,而是执行catch子句。
3)调用UpdateEntitiesAsync方法不会阻止调用线程。一旦命中await语句,执行立即返回给调用者。
4)您可以等待从异步方法返回的任务,因为它(隐式)返回一个完成此方法完成后完成的任务,如果出现这种需要,这个方法本身就是等待的。
或者,如果你真的不关心它何时完成,你可以让这个方法返回void。
5)如果你没有在这个方法中捕获异常,请知道从异步方法返回的任务是错误的,并且必须在调用链的某个地方处理。
您可以通过等待任务,访问Exception属性或调用任务的Wait方法来执行此操作。
6)方法名称中的Async后缀仅仅是一个命名约定,应用于客户端代码,以便了解方法的异步性。