避免Task和Task重复的方法

本文关键字:Task 方法 避免 | 更新日期: 2023-09-27 18:06:00

我对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);
    }
}

避免Task和Task<T>重复的方法

可以让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;
    });
}

假设Func本身没有抛出,下面的代码可以工作:

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

我们知道Result不会阻塞或抛出,因为WrapException确保它运行到完成。