gpt4 book ai didi

C#线程问题

转载 作者:行者123 更新时间:2023-11-30 13:42:37 25 4
gpt4 key购买 nike

我正在进行的是一个 ListView ,该 ListView 是根据上一次单击按钮动态创建的。然后 ti 启动一个后台工作程序,其中应清除 ListView 并每 30 秒用新信息填充 iistview。
我不断得到:跨线程操作无效:从创建它的线程以外的线程访问控制“listView2”。

  private void watcherprocess1Updatelist()
{
listView2.Items.Clear();
string betaFilePath1 = @"C:\Alpha\watch1\watch1config.txt";
using (FileStream fs = new FileStream(betaFilePath1, FileMode.Open))
using (StreamReader rdr = new StreamReader((fs)))
{
while (!rdr.EndOfStream)
{
string[] betaFileLine = rdr.ReadLine().Split(',');
using (WebClient webClient = new WebClient())
{
string urlstatelevel = betaFileLine[0];
string html = webClient.DownloadString(urlstatelevel);
File.AppendAllText(@"C:\Alpha\watch1\specificconfig.txt", html);
}
}
}

最佳答案

您不能从后台线程访问您的 ListView。您需要在 UI 线程上执行此操作。

有两个选项 - 首先,您可以将其切换为使用 Windows.Forms.Timer 每 30 秒触发一次。这将发生在 UI 线程上,这将完全避免此问题,但将处理移至 UI 线程。如果您的处理速度很慢,这可能会导致“挂起”。

或者,使用 Control.Invoke 将对 ListView 的调用编码回 UI 线程:

 listView2.Invoke(new Action( () => listView2.Items.Clear() ) );

无论如何,我都会重新考虑使用 BackgroundWorker。它不适用于定期发生的“定时事件”。如果没有长时间的处理,您应该考虑更改为 Windows.Forms.Timer(UI 线程),或者如果处理需要一个尽管。这是比永不终止的 BackgroundWorker 更好的设计选项。

关于C#线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2579854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com