簡體   English   中英

如何:在每個線程的末尾運行帶有UI更新的線程循環的最佳方法?

[英]How To: Best way to run a threaded loop with a UI update at the end of each?

這里的建築問題。

我有一個列表(通過列表視圖選擇),需要將其發送到Web服務並在數據庫中創建。 我希望能夠一次更新一個,然后使用返回的ID更新進度條,listview和本地List,而無需鎖定uithread(盡管我將鎖定listview / search控件等,但它們只需要能夠以其他形式完成其他任務)。

在那一刻,我考慮了以下內容(對大多數人來說是新的)

后台工作者-這里唯一的問題是progressChanged僅返回一個int,因此我發現很難返回我需要的所有信息。

任務-當我需要返回一個對象然后處理該信息時,我正在使用這些工具(例如從本地數據庫中獲取列表,然后填充listview,並且效果很好)。 我無法弄清楚如何產生一個線程,該線程又會循環並在每次傳遞結束時更新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中似乎有太多用於線程的選項,我簡直不認為哪個選項最適合我。 任何指針都很棒。

謝謝,皮特。

如果您的創建用戶在單獨的線程中運行。 有您的表格,有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,它會自行整理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM