从将结果传递给Action <t>参数

时间:2016-06-11 21:24:27

标签: c# .net task action

我有一个我需要连接的服务,通过这样的动作传回数据:

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;
}

任何帮助表示赞赏。这伤害了我的头脑。

2 个答案:

答案 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后缀仅仅是一个命名约定,应用于客户端代码,以便了解方法的异步性。