ここでアーキテクチャの質問。
Webサービスに送信してデータベースに作成する必要のあるリスト(リストビューで選択)があります。一度に1つずつ更新してから、uithreadをロックせずに、返されたIDでプログレスバー、リストビュー、ローカルリストを更新できるようにしたいです(ただし、リストビュー/検索コントロールなどをロックする必要があります。別の形式で他のタスクを完了します)。
その瞬間、私は次のことを検討しました(ほとんどの人にとって新しい)
バックグラウンドワーカー-ここでの唯一の問題は、progressChangedがintのみを返すため、必要なすべての情報を返すのが難しいことです。
タスク-単一のオブジェクトを返し、その情報を処理する必要があるときにこれらを使用しています(ローカルデータベースからリストを取得し、リストビューにデータを入力するなど)。ループを実行し、各パスの最後にUIスレッドを更新するスレッドを生成する方法がわかりません。
parallel.foreach-これがWebサービス要素に適しているとは思わないでください。
私がこれまでに試したすべてのものは、UIをロックするか、クロススレッド例外を取得します。
私はこれを可能にする何かを探していると思います
createUsers(ref List<users> _users)
{
foreach(user _u in _users)
{
//call webservice and update - it returns an ID or null
string newID = webCreate(_u);
if (newID != null)
{
ListViewItem lvi = listview1.FindText(_u.ListID);
lvi.SubItems[5].Text = newID;
_u.newID = newID;
}
else
{
lvi.SubItems[5].Text = "Error";
}
progressbar.value++
}
}
.net 4.0には、スレッド化のための非常に多くのオプションがあるようです。どれが最適かはわかりません。どんなポインタも素晴らしいでしょう。
ありがとう、ピート。