浏览代码

async/await

Евгений Колесников 4 月之前
父节点
当前提交
50f42a89cd
共有 1 个文件被更改,包括 38 次插入1 次删除
  1. 38 1
      articles/cs_mysql_connection3.md

+ 38 - 1
articles/cs_mysql_connection3.md

@@ -118,7 +118,7 @@
 1. Чтение данных (в конструкторе класса окна):
 
     ```cs
-    public List<Product> productList { get; set; }
+    public IEnumerable<Product> productList { get; set; }
 
     public MainWindow()
     {
@@ -129,6 +129,43 @@
     }
     ```
 
+1. В принципе этого достаточно, но получение данных из внешних ресурсов желательно заворачивать в `async/await`, так как время ответа БД может быть достаточно большим
+
+    >Не забываем про интерфейс **INotifyPropertyChanged**, иначе получится, что окно отрисуется раньше, чем данные будут получены из БД
+
+    ```cs
+    public event PropertyChangedEventHandler? PropertyChanged;
+
+    public void OnPropertyChanged(string prop = "productList")
+    {
+        if (PropertyChanged != null)
+            PropertyChanged(this, new PropertyChangedEventArgs(prop));
+    }
+    ```
+
+    Конструктор окна не может быть асинхронным, поэтому из него вызываем промежуточный метод _GetProduct_, в котором уже асинхронно запрашиваем данные 
+
+    ```cs
+    public MainWindow()
+    {
+        ...
+        GetProduct();
+    }
+
+    async private void GetProduct()
+    {
+        productList = await getProductAsync();
+        OnPropertyChanged();
+    }
+
+    async private Task<IEnumerable<Product>> getProductAsync()
+    {
+        return await Task.Run(() => Globals.dataProvider.getProduct());
+    }
+    ```
+
+
+
 Дополнительные примеры использования **Dapper** (не связаны с нашей предметной областью)
 
 1. Получение одной записи