Проблемы с C # Thread - PullRequest
       13

Проблемы с C # Thread

3 голосов
/ 05 апреля 2010

То, что я продолжаю, это динамическое создание списка из предыдущего нажатия кнопки. Затем запускается фоновый работник, в котором следует очистить представление списка и заполнять iistview новой информацией каждые 30 секунд.
Я постоянно получаю: Межпотоковая операция недопустима: Элемент управления 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);
                }
            }
        }

Ответы [ 3 ]

6 голосов
/ 05 апреля 2010

Вы не можете получить доступ к вашему ListView из фонового потока.Вы должны сделать это в потоке пользовательского интерфейса.

Есть два варианта - во-первых, вы можете переключить это, чтобы использовать Windows.Forms.Timer для запуска каждые 30 секунд.Это произойдет в потоке пользовательского интерфейса, что позволит полностью избежать этой проблемы, но переместит обработку в поток пользовательского интерфейса.Если ваша обработка медленная, это может вызвать «зависание».

В качестве альтернативы используйте Control.Invoke для перенаправления вызовов ListView обратно в поток пользовательского интерфейса:

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

В любом случае,Я бы переосмыслил использование BackgroundWorker.Он не предназначен для «синхронизированных событий», которые происходят через равные промежутки времени.Следует рассмотреть возможность перехода на Windows.Forms.Timer (поток пользовательского интерфейса), если не будет длительной обработки, или System.Timers.Timer (выполняется в фоновом потоке), если обработка займет некоторое время.Это лучший вариант дизайна, чем BackgroundWorker, который никогда не заканчивается.

2 голосов
/ 05 апреля 2010

Вот шаблон, который я использую для методов, которые будут связываться с элементом управления UI

public void DoSomethingToUI(string someParams)
{
    if(UIControl.InvokeRequired)
    {
        UIControl.BeginInvoke(()=>DoSomethingToUI(someParams));
        return;
    }
    //Do something to the UI Control
}
2 голосов
/ 05 апреля 2010

Вам необходимо использовать Control.Invoke для вызова кода в потоке пользовательского интерфейса для обновления listView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...