#c# #asynchronous #dynamics-crm #workflow
#c# #асинхронный #динамика-crm #рабочий процесс
Вопрос:
Ниже приведен мой C#
фрагмент, который запускает a mscrm
workflow
.
public void GenerateWorkflow(string selectedIDs, IOrganizationService service)
{
var request = new OrganizationRequest()
{
RequestName = "GenerateWorkflow",
};
request.Parameters.Add("SelectedIDs", selectedIDs);
var response = service.Execute(request);
if (response.Results != null amp;amp; response.Results.Count > 0)
{
return;
}
}
Могу ли я узнать, как я могу изменить приведенное выше выполнение на выполнение с sync
на async
, не дожидаясь ответа перед выполнением следующего запроса?
Спасибо.
Комментарии:
1.
Task.Run(() => GenerateWorkflow(...));
Отдельно отметим, что оператор if не имеет смысла в его нынешнем виде
Ответ №1:
Для запуска GenerateWorkflow
в отдельном потоке threadpool. Вы можете вызвать Task.Run
Ставит указанную работу в очередь для выполнения в пуле потоков и возвращает задачу или
Task<TResult>
дескриптор для этой работы.
Task.Run(() => GenerateWorkflow(...));
Если у вас было несколько запросов, которые вы хотели выполнить одновременно, и вы хотели дождаться их завершения, вы могли бы использовать Task.WhenAll
.
Создает задачу, которая завершится после завершения всех поставленных задач.
var task1 = Task.Run(() => GenerateWorkflow1(...));
var task2 = Task.Run(() => SomethingElse(...));
...
await Task.WhenAll(task1,task2,...);
Комментарии:
1. Спасибо @Общее. Могу ли я узнать
GenerateWorkflow
, может ли задача выполняться несколько раз сTask.Run()
помощью? Таким образом, у меня будетGenerateWorkflow
выполняться несколько запросов одновременно, не требуя выполнения одного, за которым следует другой.2. Это зависит от API, но да, что касается c #, все в порядке
Ответ №2:
попробуйте этот класс: «ExecuteAsyncRequest». Передайте экземпляр этого класса методу Execute, который возвращает экземпляр ExecuteAsyncResponse . точно так же: сервис.ExecuteAsyncRequest(запрос);