【发布时间】:2014-02-04 18:53:16
【问题描述】:
我目前正在为自己做一个家庭项目。 该程序是使用 Winforms 用 C# 编写的。
我目前遇到的问题如下:
我的主窗体中有一个名为 lvwGames 的列表视图 当我在没有调试的情况下运行程序时,它运行良好。 但是,当我开始调试时,出现错误。这与后台工作线程有关。
请允许我发布一些代码来帮助我。
private void MainViewLoad(object sender, EventArgs e)
{
RefreshGamesListView();
}
这里没什么特别的。 我之所以调用 RefreshGamesListView() 是因为我必须多次刷新。
被调用的方法如下所示。
public void RefreshGamesListView()
{
pbRefreshGamesList.Value = 0;
bgwRefreshList.RunWorkerAsync();
}
所以当方法被调用时,后台worker被调用并运行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 线程来进行自己的更新。查看有关此问题的其他问题以获取解决方案。
标签: c# winforms backgroundworker