[英]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.