C# - Запустить задачу в foreach listviewitem с xNet запросом - PullRequest
0 голосов
/ 05 мая 2020

Мой код:

foreach (ListViewItem item in list.Items)
        {
            string url, path, host;
            url = item.SubItems[0].Text; // example "www.google.com/"
            path =  item.SubItems[1].Text; // example = "login/"
            host = (item.SubItems[2].Text); // example = "123.123.123:232";
            bool ping = Request(url, path, host);
            if (ping) {
            item.Subitems[3].Text = "This is good";
            } else {
            item.Subitems[3].Text = "This is bad";
            }
        }

, и это метод запроса

public bool Request(string url, string path, string host)
    {
        HttpRequest httpRequest = new HttpRequest();
        //a lot if code with httpRequest 
        if (result == "good")
            return true;
        else
            return false;
    }

, поэтому эта доза кода не имеет ошибок, когда я помещаю примерно 20 элементов в список и запускаю этот код закрыть приложение, поэтому мне нужно добавить задачу, чтобы она работала без закрытия приложения.

, поэтому я делаю это

foreach (ListViewItem item in list.Items)
        {
         await Task.Run(() => {
            string url, path, host;
            url = item.SubItems[0].Text; // example "www.google.com/"
            path =  item.SubItems[1].Text; // example = "login/"
            host = (item.SubItems[2].Text); // example = "123.123.123:232";
            bool ping = Request(url, path, host);
            if (ping) {
            item.Subitems[3].Text = "This is good";
            } else {
            item.Subitems[3].Text = "This is bad";
            }
          }
        }

, но он дает мне эту ошибку Текущий поток должен быть установлен в однокомнатную квартиру (STA)

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы не можете изменить содержимое пользовательского интерфейса, если вы не вызываете его из потока пользовательского интерфейса. Чтобы сделать это из другого потока, вам нужно вызвать свой метод из диспетчера форм следующим образом:

this.Invoke(new MethodInvoker(() => 
{ 
      if (ping) {
         item.Subitems[3].Text = "This is good";
      } else {
         item.Subitems[3].Text = "This is bad";
      }
}));

//**this** is the form you want to update

Также проверьте этот вопрос, который также охватывает проблему: Вызвать в Windows Forms

0 голосов
/ 05 мая 2020

Вы не можете получить доступ к элементам пользовательского интерфейса из фонового потока (т. Е. Кода, запущенного в Task.Run).

foreach (ListViewItem item in list.Items)
{
  string url, path, host;
  url = item.SubItems[0].Text; // example "www.google.com/"
  path =  item.SubItems[1].Text; // example = "login/"
  host = (item.SubItems[2].Text); // example = "123.123.123:232";

  var result = await Task.Run(() => {
    bool ping = Request(url, path, host);
    if (ping) {
      return "This is good";
    } else {
      return "This is bad";
    }
  });
  item.Subitems[3].Text = result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...