0

ここでアーキテクチャの質問。

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には、スレッド化のための非常に多くのオプションがあるようです。どれが最適かはわかりません。どんなポインタも素晴らしいでしょう。

ありがとう、ピート。

4

1 に答える 1

1

作成ユーザーが別のスレッドで実行されている場合。フォームを持って、updatestatusbarを持ってください

delegate void updStatusbar(int i);
public UpdateStatusBar(int i)
{
  if (Statusbar1.InvokeRequred)
  {
    updStatusbar c = UpdateStatusBar;
    this.Invoke(c,new object[] {i});
  }
  else
    Statusbar1.value=i;
  }
}

これで、どこからでも、スレッドなどからupdatestatusbarを呼び出すことができ、それ自体が分類されます。

于 2012-08-24T09:31:55.303 に答える