如何将异步任务存储在字典中并根据配置值调用它们?

Posted

技术标签:

【中文标题】如何将异步任务存储在字典中并根据配置值调用它们?【英文标题】:How can I store async task in a dictionary and call them according to config value? 【发布时间】:2021-10-06 07:41:39 【问题描述】:

下面是我的代码:

public interface IResponseEntity



public class ResponseEntity : IResponseEntity

    public string Status  get; set; 
    public string Message  get; set; 
    public string Data  get; set; 


public class ObjectForRequest

    public string abcd  get; set; 
    public string xyz  get; set; 
    public string pqrs  get; set; 
    public short mnop  get; set; 


private async Task<IResponseEntity> Dowork_for_A(ObjectForRequest objReq)

    //Code for A
    ....................


private async Task<IResponseEntity> Dowork_for_B(ObjectForRequest objReq)

    //Code for B
    ....................


private async Task<IResponseEntity> Dowork_for_C(ObjectForRequest objReq)

    //Code for C
    ....................


private async Task<IResponseEntity> Dowork_for_D(ObjectForRequest objReq)

    //Code for D
    ....................


public async Task<IResponseEntity> method(ObjectForRequest objReq)

    if (CONFIGVALUE == 'A')
        return await Dowork_for_A(RequestOBJ);
    else if (CONFIGVALUE == 'B')
        return await Dowork_for_B(RequestOBJ);
    else if (CONFIGVALUE == 'C')
        return await Dowork_for_C(RequestOBJ);
    else if (CONFIGVALUE == 'D')
        return await Dowork_for_D(RequestOBJ);
    else
        return null;

好像现在我正在检查 if 条件中的配置值,然后调用异步任务返回值。

如何将 &lt;key, value&gt; 字典对设置为配置值作为“键”和“值”作为异步任务?或者换句话说,我

【问题讨论】:

不是我的专长,但这不就是 Actions 的用途吗? 您能否举例说明您如何使用包含Tasks 的Dictionary 我认为你在method 中有错字 - RequestOBJ 应该是 objReq 对吧? 【参考方案1】:

这很简单。像这样声明你的字典:

    Dictionary<char, Func<ObjectForRequest, Task<IResponseEntity>>> _actions =
         new Dictionary<char, Func<ObjectForRequest, Task<IResponseEntity>>>()
    
         'A', Dowork_for_A ,
         'B', Dowork_for_B 
        // ...
    

然后:

public async Task<IResponseEntity> method(ObjectForRequest objReq)

     Func<ObjectForRequest, Task<IResponseEntity>> action;
     if (!_actions.TryGetValue(CONFIGVALUE, out action))
     
          return null;
        
     return await action(objReq);

另外,请务必考虑这对性能的影响。字典对于大型集合来说速度很快,但如果你真的只有 3 或 4 个选项,switchif ... else 链几乎肯定会更快。当Dictionary 变得更好时,确切的临界点是什么很难说。

【讨论】:

如果只有 3 或 4 个选项并且您正在启动一项任务,那么使用字典或开关等的相对速度几乎不会成为问题。

以上是关于如何将异步任务存储在字典中并根据配置值调用它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何将异步函数存储在结构中并从结构实例中调用它?

将函数存储在列表中并稍后调用它们

如何根据对应的值过滤字典键

如何将字典存储到我的解析仪表板中并从中提取数据(Swift 3)

将双精度值存储在二进制文件中并读取它

如何将代表存储在列表中