C#线程问题

标签 c#

我正在进行的是一个 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/

相关文章:

c# - 自定义按钮上的 PerformClick 将不起作用

c# - Entity Framework Eager 只加载其他表的一个子集

c# - IsFinite() 等效

c# - C#中的Excel进程

c# - 有哪些 VC# 无法做到而 VC++(原生)可以做到的事情?

c# - 具有动态目标的 CaSTLe 接口(interface)代理

c# - 在 POST 方法、HttpClient 中使用 application/x-www-form-urlencoded

c# - 将 TreeView 与 ObservableCollection 绑定(bind)

c# - 使用本地网络中的套接字将文件从C#服务器发送到AS3 AIR客户端-带有示例

c# - 序列化任何自定义 WCF SecurityToken 的好方法?