Как правильно ожидать выполнения restrequestasync, чтобы можно было работать с полученными данными далее в форме - PullRequest
0 голосов
/ 18 апреля 2019

Я разрабатываю клиентское приложение на формах.Существует форма авторизации, и я отправляю запрос авторизации на сервер.Если статус в порядке, то рабочая форма запускается.Для запросов я использую Restsharp.Но у меня проблема с ответом.После десериализации я сохраняю значения в одном глобальном классе для рисования диаграммы и добавляем в сетку данных.

Проблема: этот асинхронный запрос выполняется некоторое время, и когда я загружаю рабочую форму, я вызываю метод для работы с ответными данными, но асинхронный метод не завершен, и в моем сингле я не получаю свои ответные данные.

Я попытался установить глобальный триггер, но не смог получить доступ из другого потока.Также я не смог сразу заполнить из другого потока, так как все элементы управления находятся в основном потоке.

//request for responcing data
 public RestRequestAsyncHandle DataRsp( Action<IRestResponse<DataResponce>, RestRequestAsyncHandle> callback, int NumberOfManufacture)
        {
            string resource = "/api/data/" + NumberOfManufacture;
            var request = new RestRequest(resource);
            //  request.RootElement = "AuthResponce";
            request.Method = Method.GET;
            request.RequestFormat = DataFormat.Json;
            return Execute<DataResponce>(request, callback);
        }

//global single class where i want to keep my responced data

        public class GlobalState {

          private GlobalState(){}

          private static GlobalState instance;

          public static GlobalState GetInstance()
             {
                 if (instance == null)
                     instance = new GlobalState();
                 return instance;
             }
        private bool state = false;
        private string[] time;
        private int[] shift;
  public string[] Time
        {
            get { return time; }
            set { time = value; }
        }

        public int[] Shift
        {
            get { return shift; }
            set { shift = value; }
        }
}

//async request method where i deserialize json responce

 private void Resp()
        {
           GlobalState gs = GlobalState.GetInstance();
           gs.NumberOfManufacture = 1;
                DataResponce[] dt = new DataResponce[]{};
                var asyncHandle = Api.Api.GetInstance().DataRsp((x, y) =>
                {
                        dt = Newtonsoft.Json.JsonConvert.DeserializeObject<DataResponce[]>(x.Content);
                }, gs.NumberOfManufacture);

                    for (int i = 0; i < dt.Length; i++)
                    {
                        gs.Time[i] = dt[i].Time;
                        gs.Energy_resources[i] = dt[i].Energy_resources;
                        gs.Production[i] = dt[i].Production;
                        gs.Shift[i] = dt[i].Shift;
                        gs.Specific_consumption[i] = dt[i].Specific_consumption;
                    }
        }

//system form load methon where i call the Resp metho and after this wants to work whith rsponced data

private void WorkingForm_Load(object sender, EventArgs e)
        {
           infoControl.Chart.init();
           infoControl.Chart.DrawFromDgv(dataGrid.Datadgv);
           Resp();
           ControlsAdd ca = new ControlsAdd();
           ca.AddDataToDataDgv(dataGrid.Datadgv);
        }

Я хочу добавить их в элементы управления после получения данных и работы с ними, но так какАсинхронный метод не успевает завершиться, я получаю ошибку об отсутствии данных.Я новичок в асинхронном программировании и мне не приходилось работать с большими проектами. Спасибо.

...