簡素化された 7 つのステップ :
- [MainForm] ユーザーが btnAdd ボタンをクリック
- AddFormが表示されます
- [AddForm] btnCreate をクリック
- btnCreate_Click 内で awaiter を使用して AddProductProcess を実行 します * クリックするとすぐに AddForm を閉じます *そして MainForm を表示します
- AddProductProcess 内で awaiter を使用して AddProduct を実行します
- AddProduct を実行すると、長いプロセスが実行され、アプリケーション レベルの静的コレクション (ProductCollection) が埋められます。
- [MainForm] AddProduct の処理が完了すると、lstProducts ListBox に追加された製品アイテムが表示されます。
5 つのコード :
private void btnAddProduct_Click(object sender, EventArgs e)
{
FormAddProduct fap = new FormAddProduct(SelCol);
fap.ShowDialog();
}
private async void btnCreate_Click(object sender, EventArgs e)
{
string stProduct = txtProductName.Text;
await ProductCollection.AddProductProcess(stProduct);
this.Close();
MainForm.Show();
}
public async Task AddProductProcess(string pName)
{
await Task.Factory.StartNew(() => AddProduct(pName));
// This would be our heavy process
}
public void AddProduct(string pName)
{
ProductItem p = new ProductItem();
p.Name = pName ;
p.Position = Count;
p.GetInfo(); // and some similar heavy methods are inside this
//ProductCollection.Add(p);
}
public void Add(Product product)
{
MainForm.lstProduct.Add(product.Name);
}
「MainForm.lstProduct.Add」でinvalid cross-thread operation
エラーが発生する
リストボックスに適切な方法で結果を追加できるように、タスク完了通知を追加する必要があります。実装を手伝ってもらえますか?
このコード行を、タスクが終了した直後に実行されるコードに渡す必要があります。
ProductCollection.Add(p);
このコードと件名に関するアイデアは大歓迎です。