0

这里是一个建筑问题。

我有一个需要发送到 Web 服务并在数据库中创建的列表(通过列表视图选择)。我希望能够一次更新一个,然后使用返回的 ID 更新进度条、列表视图和本地列表,而不锁定 uithread(虽然我将锁定列表视图/搜索控件等,但它们只需要能够以不同的形式完成其他任务)。

此刻我考虑了以下内容(对大多数人来说都是新的)

后台工作人员 - 这里唯一的问题是 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

如果您的创建用户在单独的线程中运行。有你的表格,有一个更新状态栏

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 回答