避免任务和任务的重复方法<t> </t>

时间:2014-05-29 16:41:27

标签: c# .net task

我对TaskTask<T>有一些逻辑。 有没有办法避免重复代码?

我目前的代码如下:

public async Task<SocialNetworkUserInfo> GetMe()
{
    return await WrapException(() => new SocialNetworkUserInfo());
}

public async Task AuthenticateAsync()
{
    await WrapException(() => _facebook.Authenticate());
}

public async Task<T> WrapException<T>(Func<Task<T>> task)
{
    try
    {
        return await task();
    }
    catch (FacebookNoInternetException ex)
    {
        throw new NoResponseException(ex.Message, ex, true);
    }
    catch (FacebookException ex)
    {
        throw new SocialNetworkException("Social network call failed", ex);
    }
}

public async Task WrapException(Func<Task> task)
{
    try
    {
        await task();
    }
    catch (FacebookNoInternetException ex)
    {
        throw new NoResponseException(ex.Message, ex, true);
    }
    catch (FacebookException ex)
    {
        throw new SocialNetworkException("Social network call failed", ex);
    }
}

2 个答案:

答案 0 :(得分:2)

您可以让Task重载调用另一个,并返回一个虚拟值。

public async Task WrapException(Func<Task> task)
{
    await WrapException<object>(async () => {
        await task();
        return null;
    });
}

或者,因为此处不需要async关键字:

public Task WrapException(Func<Task> task)
{
    return WrapException<object>(async () => {
        await task();
        return null;
    });
}

答案 1 :(得分:1)

假设Func本身不会抛出,则以下方法可行。

public async Task<T> WrapException<T>(Func<Task<T>> task)
{
    var actualTask = task();
    await WrapException((Task)actualTask);
    return actualTask.Result;
}

我们知道ResultWrapException确保其完成而无法阻止或抛出。