gpt4 book ai didi

c# - 仅在需要时将对象包装到任务
转载 作者:行者123 更新时间:2023-12-02 03:59:18 25 4
gpt4 key购买 nike

我正在扩展现有的 Rpc 库以支持异步方法。

在当前的实现中,我使用工厂方法来构建类型化委托(delegate),如下所示(我省略了一些与问题无关的实现细节):

    public static Func<ServiceType, PayloadType, object> BuildServiceMethodInvocation<ServiceType>(MethodInfo serviceMethod)
{
return (service, payload) =>
{
try
{
// payload is mapped onto an object[]
var parameters = ReadPayload(payload)
var result = serviceMethod.Invoke(service, parameters);

return result;
}
catch (TargetInvocationException e)
{
// bla bla bla handle the error
throw;
}
};
}

结果object然后传递给序列化类,该类将处理每种情况。

现在我还想支持异步方法,即返回 Task<T> 的方法。 .

我想更改 BuildServiceMethodInvocation 的签名所以它是 Func<ServiceType, PayloadType, Task<object>> .

我不知道如何轻松地将每个可能的值包装在 Task<object> 中:它应该处理普通值,但也 Task<T> (装箱到一个对象中)。

有什么想法吗?

编辑:serviceMethod 可以返回一个字符串,我想得到一个 Task<object>返回字符串值。但 serviceMethod 可能会返回 Task<int> ,在这种情况下我想取回 Task<object>返回 int 值(装箱到对象中)。

最佳答案

使其在语法上工作的最简单方法是 Task.FromResult 。现在,这并不会使您的方法变得异步。但没有涉及额外的装箱或拆箱,至少不会比以前更多。

public static Func<ServiceType, PayloadType, Task> BuildServiceMethodInvocation<ServiceType>(MethodInfo serviceMethod)
{
return (service, payload) =>
{
try
{
// payload is mapped onto an object[]
var parameters = ReadPayload(payload)
var result = serviceMethod.Invoke(service, parameters);

// forward the task if it already *is* a task
var task = (result as Task) ?? Task.FromResult(result);

return task;
}
catch (TargetInvocationException e)
{
// bla bla bla handle the error
throw;
}
};
}

关于c# - 仅在需要时将对象包装到任务<object>中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42580385/

25 4 0