我目前正在为自己的家庭项目工作。该程序是使用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