首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Task<T>转换为Task<DerivedT>

将Task<T>转换为Task<DerivedT>
EN

Stack Overflow用户
提问于 2016-05-13 15:10:05
回答 1查看 1.4K关注 0票数 7

我有一个同步的、通用的方法,如下所示

代码语言:javascript
复制
public TResponse Execute<TResponse>(Request request) where TResponse : Response
{
   return (TResponse) proxy.ExecuteRequest(request);

代理是WCF服务引用。

它只有一个接收请求并返回响应的方法。但是它是通过传递派生请求和返回派生响应来使用的。如上文所示,包装器方法将响应转换为泛型参数(TResponse)指定的派生类型。

使用派生的请求和响应调用方法。

例如:

代码语言:javascript
复制
Execute<GetSomeDataResponse>(new GetSomeDataRequest());

我现在正在生成一个异步服务引用,这样就可以使用任务。

所以我想要一种像这样的方法

代码语言:javascript
复制
public Task<TResponse> ExecuteAsync<TResponse>(Request request) where TResponse : Response
{
    // need to cast to a Task<TResponse>
    return proxy.ExecuteRequestAsync(request

可以这样称呼

代码语言:javascript
复制
Task<GetSomeDataResponse> res = ExecuteAsync<GetSomeDataResponse>(new GetSomeDataRequest());

因此,我需要一种将Task<Response>转换为Task<TResponse>的方法

我一直在读这篇文章,这似乎与我所需要的完全相反,但我不太明白如何将它转化为用例。

?

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-13 15:18:24

简单的方法是使用异步\等待模式:

代码语言:javascript
复制
 public static async Task<TResponse> ExecuteAsync<TResponse>(Request request) where TResponse : Response {
    var response = await proxy.ExecuteRequestAsync(request);
    return (TResponse) response;
 }

更复杂的(摘自您的链接问题)是使用TaskCompletionSource

代码语言:javascript
复制
public static Task<TResponse> ExecuteAsync2<TResponse>(Request request) where TResponse : Response {
    var tcs = new TaskCompletionSource<TResponse>();
    proxy.ExecuteRequestAsync(request).ContinueWith(t => {
        if (t.IsFaulted)
            tcs.TrySetException(t.Exception.InnerExceptions);
        else if (t.IsCanceled)
            tcs.TrySetCanceled();
        else
            tcs.TrySetResult((TResponse) t.Result);
        }, TaskContinuationOptions.ExecuteSynchronously);
    return tcs.Task;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37213557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档