2017-03-05 28 views
1

我想执行一个动作,它接受一种模型参数并执行一些动作,然后返回相同模型参数的类型。通用异步函数来处理不同的模型

这些模型在外部DLL中定义,并且不能修改。

我目前正在实现由

private async Task<Model1> ExecuteTask(Task<Model1> model) 
{ 
    //perform some action 
} 

private async Task<Model2> ExecuteTask(Task<Model2> model) 
{ 
    //perform some action 
} 

private async Task<Model3> ExecuteTask(Task<Model3> model) 
{ 
    //perform some action 
} 

功能是否有一个通用的方法来做到这一点?

回答

-1

想出解决方案

private const int RequestTimeoutInMilliseconds = 10000; 

public async Task<T> ExecuteTask<T>(this Task<T> task) 
{ 
    if (await Task.WhenAny(task, Task.Delay(RequestTimeoutInMilliseconds)).ConfigureAwait(false) == task) 
    { 
     return task.Result; 
    } 

    throw new OperationCanceledException(typeof(T) + " Task failed"); 
} 

进行通话

var task = client.ApiAsync(); 
var responseResult = task.ExecuteTask().Result 

更新:我不知道为什么这个答案我收到了一个downvote。这个想法是不关心模型的类型,只是在不知道模型类型的情况下执行任务。

0

如果这些型号不从一个共同的基类继承,不实现相同的接口,那么就不会是一个“纯”的方式(即我所知道的)来做到这一点。你可以创建一个函数,获取一个Object,然后你可以尝试将其转换为其中一个模型,但返回值将再次需要为Object

1

,你可以创建一个通用的函数/类,它保持了执行,但是提供它们是从同一个抽象/基类basemodel

public async T ExecuteTask<T>(T s) where T : Task<BaseModel> 
{ 
    // perform some actions. 
} 
相关问题