gpt4 book ai didi

c# - 将 Task 转换为 Task

转载 作者:太空狗 更新时间:2023-10-29 21:53:17 25 4
gpt4 key购买 nike

我有一个看起来像这样的同步通用方法

public TResponse Execute<TResponse>(Request request) where TResponse : Response
{
return (TResponse) proxy.ExecuteRequest(request);

代理是一个 WCF 服务引用

它只有一个接受请求并返回响应的方法。但它是通过传递派生请求并返回派生响应来使用的。正如您在上面看到的,包装器方法正在将响应转换为由通用参数 (TResponse) 指定的派生类型。

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

例如

Execute<GetSomeDataResponse>(new GetSomeDataRequest());

我现在正在生成异步服务引用,以便可以使用任务

所以我想要一个看起来像这样的方法

public Task<TResponse> ExecuteAsync<TResponse>(Request request) where TResponse : Response
{
// need to cast to a Task<TResponse>
return proxy.ExecuteRequestAsync(request

可以这样调用

Task<GetSomeDataResponse> res = ExecuteAsync<GetSomeDataResponse>(new GetSomeDataRequest());

所以我需要一种方法来转换 Task<Response>Task<TResponse>

我一直在阅读这似乎与我需要的相反,但不能完全弄清楚如何将它弯曲到我的用例

How to convert a Task<TDerived> to a Task<TBase>?

有什么想法吗?

最佳答案

简单的方法是使用 async\await 模式:

 public static async Task<TResponse> ExecuteAsync<TResponse>(Request request) where TResponse : Response {
var response = await proxy.ExecuteRequestAsync(request);
return (TResponse) response;
}

有点复杂(取自您的链接问题)是使用 TaskCompletionSource:

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

关于c# - 将 Task<T> 转换为 Task<DerivedT>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37213557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com