我目前正在爲自己的家庭項目工作。該程序是使用winforms用C#編寫的。C#winform backgroundworker
我目前遇到的問題如下:
我有我的MainForm稱爲lvwGames 一個ListView當我沒有調試運行程序,它運行良好。 但是,當我開始調試時,出現錯誤。這與後臺工作線程有關。
允許我發佈一些代碼來幫助我。
private void MainViewLoad(object sender, EventArgs e)
{
RefreshGamesListView();
}
這裏沒什麼特別的。 我調用RefreshGamesListView()的原因是因爲我不得不多次刷新。
被調用的方法看起來像這樣。
public void RefreshGamesListView()
{
pbRefreshGamesList.Value = 0;
bgwRefreshList.RunWorkerAsync();
}
所以當調用該方法時,將調用後臺工作器並運行dowork方法。 這個是相當大的。
private void BgwRefreshListDoWork(object sender, DoWorkEventArgs e)
{
List<Game> games = _mainController.RetrieveAllGames();
int count = 1;
foreach (Game game in games)
{
string id = game.id.ToString();
var li = new ListViewItem(id, 0);
li.SubItems.Add(game.title);
li.SubItems.Add(game.Genre.name);
li.SubItems.Add(game.Publisher.name);
li.SubItems.Add(game.Platform.name);
li.SubItems.Add(game.CompletionType.name);
li.SubItems.Add(game.gameNotice);
lvwGames.Items.Add(li);
double dIndex = (double)(count);
double dTotal = (double)games.Count;
double dProgressPercentage = (dIndex/dTotal);
int iProgressPercentage = (int)(dProgressPercentage * 100);
count++;
bgwRefreshList.ReportProgress(iProgressPercentage);
}
}
當我在調試中運行代碼時,代碼是在lvwGames.Items.Add(li); 它給我下面的錯誤:
Cross-thread operation not valid: Control 'lvwGames' accessed from a thread other than the thread it was created on.
我絕對不知道爲什麼。 我認爲這是代碼特定的。但這也意味着我不能完全獲得後臺工作者,特別是何時正確使用它。
我使用它的原因是因爲我正在從數據庫中加載一個大的大型列表,我想在加載列表時保持UI的響應性,並通知用戶它有多遠,使用進度條。
如果有任何代碼丟失,或者您真的明白爲什麼會發生這種情況請解釋我爲什麼在這種情況下會導致錯誤。你不需要爲我修復它。我只是想知道它是什麼原因造成的。
感謝您花時間閱讀本文。我希望能夠儘快繼續使用調試器。 :)
這是因爲您正在從後臺線程更新UI,而不是調用UI線程進行自己的更新。查看解決方案的其他問題。 – ChrisF