#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 варианта, и вы запускаете задачу, То относительная скорость использования словаря или переключателя и т. Д. Вряд ли будет проблемой.