Как я могу хранить асинхронные задачи в словаре и вызывать их в соответствии со значением конфигурации?

#c# #.net #multithreading #asynchronous

Вопрос:

Вот мой код ниже:

 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, а затем вызываю асинхронную задачу, чтобы вернуть значение.

Как я могу настроить <key, value> пару словарей в качестве значения конфигурации в качестве «ключа» и «значения» в качестве асинхронной задачи? Или, другими словами, как я могу хранить асинхронные задачи в словаре и вызывать их в соответствии со значением конфигурации?

Комментарии:

1. Не моя специальность, но разве не для этого нужны Действия?

2. Не могли бы вы показать пример того, как вы представляете себе использование Dictionary букв, содержащих Task буквы s?

3. Я думаю, у вас есть опечатка в 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 варианта, switch if ... else цепочка или почти наверняка будет быстрее. Трудно сказать, какой именно переломный момент наступит, когда Dictionary станет лучше.

Комментарии:

1. Если есть только 3 или 4 варианта, и вы запускаете задачу, То относительная скорость использования словаря или переключателя и т. Д. Вряд ли будет проблемой.