0

我有一个大型项目,我正在使用 C# 进行开发,C# 是一种我相当陌生的语言。该项目严重依赖 GUI,并且显示了大量数据。最近,我们在以前从未出现过的地方遇到了跨线程错误。这些发生的错误很容易解决:

if (logListView.InvokeRequired)
{
      logListView.BeginInvoke(new MethodInvoker(
          () => logListView.Items[logListView.Items.Count - 1].EnsureVisible()));
}
else
{
      logListView.Items[logListView.Items.Count - 1].EnsureVisible();
}

然而,我的问题是:每次访问 Windows 窗体对象时都需要应用该方法吗?有特殊情况吗?我没有使用多线程,所以据我所知,这些错误发生在我的控制之外。例如,我无法控制哪段代码由哪个线程执行:C# 自己完成所有这些工作(我不太了解该语言)。为修改 GUI 的每一行实现一个 if 语句似乎非常令人讨厌。

4

2 回答 2

1

如果您从 UI 线程外部(即从您产生的任何线程)访问 winform 组件,您只需要该代码。核心库中有一些组件会产生线程,例如FileSystemWatcher. Winforms 不只是自己产生线程,它只有 UI 线程。由于您编写的代码或您使用的库,会出现任何跨线程问题。

于 2012-08-04T20:51:05.123 回答
0

您只需要在代码不在 GUI 线程中运行时调用代码。

我无法控制哪段代码由哪个线程执行

是的你可以。在 GUI 线程中运行哪些代码并没有什么不可预测的,您只需要找出规则是什么。

在您的代码中用完 GUI 线程的唯一代码是作为异步回调运行的方法,例如计时器或异步 Web 请求。(虽然在 GUI 线程中System.Windows.Forms.Timer运行事件。)Tick

(还有其他方法可以在另一个线程中运行代码,但是您会意识到使用多线程。)

于 2012-08-04T20:59:53.583 回答