Невозможно взаимодействовать с формой при запуске веб-метода? - PullRequest
0 голосов
/ 03 ноября 2011

Я сделал C # форму Windows. Он использует веб-метод, а затем я хочу записать результаты веб-метода в список. Веб-метод работает в цикле, пока я не нажму кнопку остановки.

Проблема в том, что я не могу щелкнуть ни по одному из элементов управления в форме, и даже перемещение по самой форме невозможно.

Хотя функция добавления результатов веб-методов в список работает. Но это в значительной степени бесполезно, так как я не могу прокрутить список добавленных элементов.

Я помещаю время ожидания в 1 секунду между каждым вызовом веб-метода, но это не помогает ...

bool stop = false;
private void button1_Click(object sender, EventArgs e)
{
    stop = false;
    while (stop == false) { 
        GetTime(textBox1.Text);
        System.Threading.Thread.Sleep(1000);
    }
}

private void GetTime(string mid)
{
    string i;
    com.Service test = new com.Service();
    i = test.GetZonedDateTimeByMID(mid).ToString();
    lstLog.Items.Add(i);
}

private void btnStop_Click(object sender, EventArgs e)
{
    stop = true;
}

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Вызов статического метода Thread.Sleep(X) приведет к тому, что текущий поток (в вашем случае поток пользовательского интерфейса вашего приложения) перейдет в спящий режим.Так что да, это сделает ваше приложение не отвечающим.Вы должны выполнять свою работу из фонового рабочего потока, используя Task или вызывая ThreadPool.QueueUserWorkItem.

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

1 голос
/ 03 ноября 2011

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

...