将传递的函数结果分配给C#中具有变量类型的对象

问题描述 投票:0回答:1

对于集成,我每天运行一次服务,我需要将API调用的结果分配给局部变量。但是,这些API可能随时决定抛出401错误,在这种情况下,我只想重试一次,最多3次。我有一个起作用的代码可以做到这一点:

List<APIEntityProject> projectList = null;

private bool SetProjectList(){
    const maxRetries = 3;
    const RetryPause = 3000;
    int retries = 0;
    do
    {
        try
        {
            projectList = ProjApi.GetProject(activeWorkspace.WorkspaceCode);
        }
        catch (ApiException e)
        {
            if (e.ErrorCode == 401) // Unauthorized error (e.g. user doesn't have access to this Workspace
            {
                Log.Warning("Unauthorized error while fetching projects from Workspace, try {retries}",retries);
                retries++;
                System.Threading.Thread.Sleep(RetryPause * retries);//Waits 3 and then 6 seconds before retrying.
            }
            else throw;
        }
    } while (projectList == null || retries < maxRetries);
    if (retries == maxRetries)
    {
        Log.Error("An error has occured while trying to retrieve affected Projects, skipped document");
        errorCount++;
        return false;
    }
    return true;
}

但是很不幸,我经常需要复制此逻辑,所以我想在函数中使用它,例如RetryNTimes(类似于This Solution

List<APIEntityProject> projectList = null;
List<APIEntityWBS> WBSList = null;
List<APIEntitySopeItem> SIList = null;
List<APIEntityScopeAsignment> SAList = null;
List<APIEntityActivity> ActList = null;
...

RetryNTimes(projectList,ProjApi.GetProject(activeWorkspace.WorkspaceCode),3,3000,"ProjectList");
RetryNTimes(WBSList, WBSApi.GetAllWBS(activeProject.ProjectID),3,3000,"WBSList");
RetryNTimes(SIList, SIApi.GetAllScopeItems(activeProject.ProjectID),3,3000,"ScopeItemsList");
RetryNTimes(SAList, SAApi.GetAllScopeAssignments(activeProject.ProjectID),3,3000,"ScopeAssignmentsList");
RetryNTimes(ActList, ActApi.GetAllActivities(activeProject.ProjectID),3,3000,"ActivityList");
...

private bool RetryNTimes(T object, Func<T> func, int times, int WaitInterval, string etext){
    do
    {
        try
        {
            object = func();
        }
        catch (ApiException e)
        {
            if (e.ErrorCode == 401)
            {
                retries++;
                Log.Warning("Unauthorized error while fetching {APIErrorSubject}, try {retries}",eText,retries);
                System.Threading.Thread.Sleep(RetryPause * retries);//Waits 3 and then 6 seconds before retrying.
            }
            else throw;
        }
    } while (object == null || retries < maxRetries);
    if (retries == maxRetries)
    {
        Log.Error("An error has occured while trying to retrieve {APIErrorSubject}, skipped document",eText);
        errorCount++;
        return false;
    }
    return true;
}

我也读过typedef and function pointers,但不确定是否可以使用变量类型。有任何想法吗?

c# function-pointers
1个回答
0
投票

该文章指的是C语言。在C#中,您可以使用委托。这是link,可以让您开始。

© www.soinside.com 2019 - 2024. All rights reserved.