【发布时间】:2013-08-09 15:36:12
【问题描述】:
我正在寻找有关如何处理以下情况的建议。
我正在创建方法来尝试获取一些数据,遵循以下模式:
// Typical pattern
public bool TryBlah(string key, out object value)
{
// ... set value and return boolean
}
我在尝试在他们的异步版本上遵循此模式时遇到了一个问题,因为您不能在异步方法上使用 out:
// Ideal async pattern (not allowed to use an 'out' parameter, so this fails)
public async Task<bool> TryBlah(string key, out object value)
{
// ... set value, perform some slow io operation, return bool
}
一种解决方法是返回一个包含您的数据的元组。这适用于返回单一数据类型的方法,如下所示:
// Tuple version
public async Task<Tuple<bool, object>> TryBlah(string key)
{
// ... perform some slow io, return new Tuple<bool, object>(...)
}
问题是当您想要返回不同的数据类型时。如果不使用 async,您可以创建几个具有几乎相同签名的方法,如下所示:
public bool TryBlah(string key, out byte[] value)
{
// ...
}
public bool TryBlah(string key, out string value)
{
// ...
}
那太好了。这就是我想要做的。这个api非常简单易用(方法名都是一样的,只是传入的数据有变化)。
虽然不能将out 与异步方法一起使用,但这会造成混乱。
解决此问题的一种方法是返回数据的Tuple。但是,现在您不能拥有几乎相同的方法签名,如下所示:
// The suck... the signatures match, but you want to return different values.
// You can't do this:
public async Task<Tuple<bool, byte[]>> TryBlah(string key)
{
// ...
}
public async Task<Tuple<bool, string>> TryBlah(string key)
{
// ...
}
这些方法失败是因为它们具有相同的签名。解决这个问题的唯一方法是给每个方法一个不同的名称,如下所示:
public async Task<Tuple<bool, byte[]>> TryBlahByteArray(string key)
{
// ...
}
public async Task<Tuple<bool, string>> TryBlahString(string key)
{
// ...
}
我的问题是,这现在创建了我认为令人讨厌的 api,您现在有很多不同的方法。是的,这不是什么大问题,但我觉得必须有更好的方法。
在使用这样的异步方法时,是否还有其他模式可以提供更好的 api?我愿意接受任何建议。
【问题讨论】:
标签: c# async-await