Асинхронные и ожидающие методы

У меня есть разъяснения относительно асинхронных и ожидающих методов в C# в практическом применении. Рассмотрим следующий поток, представляющий собой простую версию рабочего кода:

Helper.cs

public class Helper
{
   public CustomDTP _customDTO = null;
   public async Task<Analysis> GetAnalysis(string name, int id,string option)
        {

          if(option == "a")
           {
             //Call ThirdParty service and get Data
             _CustomDTO.Data1 = await GetData1(name,id);
           }
          else if(option == "b")
           {
             //Call ThirdParty service and get Data
             _CustomDTO.Data2 = await GetData2(name,id);
           }
          return _customDTO;
        }
}

FunctionController.cs

    [HttpPost]
    [EnableQuery]
    [ODataRoute("ProcessData")]
    public async Task<string> ProcessData(HttpRequestMessage message)
    {

            var js = new JavaScriptSerializer();
            var Result = message.Content.ReadAsStringAsync().Result;
            info = js.Deserialize<CustomDTO>(Result);

            Helper Servc = new Helper();

            var DetailData = await Servc.GetAnalysis(info);

            Data = Newtonsoft.Json.JsonConvert.SerializeObject(DetailData);
        return Data;
       }

Processing.js

//Knockout js application

self.compositionComplete = function()
{
  self.Data1();
  self.Data2();
}
 self.Data1 = function () {
            var getURL = Url + "/ProcessData";
            var initData = {
                "name": self.name,
                "id": self.id,
                "option": "a"
            }
        $.ajax({
                url: getURL,
                cache: false,
                type: "POST",                
                data: JSON.stringify(initData),
                dataType: 'json',
                success: function (result) {
                    //Rendering Data Logic for Option a
        });
}

self.Data2 = function () {
            var getURL = Url + "/ProcessData";
            var initData = {
                "name": self.name,
                "id": self.id,
                "option": "b"
            }
        $.ajax({
                url: getURL,
                cache: false,
                type: "POST",                
                data: JSON.stringify(initData),
                dataType: 'json',
                success: function (result) {
                    //Rendering Data Logic for Option b
        });
}

Теперь проблема в том, GetData1() услуги третьих лиц занимает меньше времени (например, 2 секунды) и GetData2() занимает больше времени (например: 100 секунд) . Идея сделать два вызова ajax и использовать async и await состояла в том, чтобы отобразить self.Data1 на экране и не ждать, пока self.Data2 будет получено. К сожалению, в этом случае этого не происходит, мне придется подождать 100 секунд, чтобы на экране отображались как Данные 1, так и Данные 2. Что мне нужно изменить, чтобы убедиться, что отдельные потоки используются для GetData1 и GetData2.

Еще одно наблюдение заключается в том, что, если я вызываю self.Data2 в случае успеха self.ata1(), как показано ниже, я могу сразу увидеть Data1 на экране, но это не то, что я ищу. Мне нужно, чтобы и Data1, и Data2 отображались параллельно и асинхронно.

self.Data1 = function () {
            var getURL = Url + "/ProcessData";
            var initData = {
                "name": self.name,
                "id": self.id,
                "option": "a"
            }
        $.ajax({
                url: getURL,
                cache: false,
                type: "POST",                
                data: JSON.stringify(initData),
                dataType: 'json',
                success: function (result) {
                    self.Data2();
        });
}

Я уверен, что поток блокируется после использования await, но я не могу получить разрешение для выполнения отдельных вызовов и параллельного рендеринга Data1 и Data2. Есть какие-либо материалы по этому вопросу?

1 ответ

Я не уверен, но все вроде бы хорошо. Я не работал с knockout как бы то ни было, эта часть кажется мне "подожди, пока все задачи не будут выполнены" или что-то в этом роде

self.compositionComplete = function()
{
  self.Data1();
  self.Data2();
}

что-то вроде уволенного, когда они оба закончили. Может быть, вы можете использовать разные self,

Другие вопросы по тегам