Вызвать в классе в c # winforms - PullRequest
1 голос
/ 20 января 2011

У меня есть поток, работающий в классе, который должен обновить значение текстового поля, но invoke не отображается в классе.

Есть идеи, как это сделать?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.IO;
using CheckedBoxSerpCrawler;
namespace SERP_Crawler
{   
    class Crawl
    {
        public Crawl()
        {              

        var t = new Thread(() =>
              {
                 for (int i = 2; i < (pagesToScroll / 10); i++)
                  {
                        //Here i need to invoke CheckUrlList
                  } 
              });
        t.SetApartmentState(ApartmentState.STA);
        t.Start();          

        }//End Constructor
    private void CheckUrlList(object sender, EventArgs e)
    {
        //Here update textbox
    }
}
}

Ответы [ 4 ]

1 голос
/ 20 января 2011

Вам нужно вызывать Invoke для текстового поля, а не для класса, который хочет обновить текстовое поле.Если вы посмотрите на документацию для Invoke:

Выполняет указанный делегат в потоке, который владеет дескриптором основного элемента управления.

, тогда выможет видеть, что важен поток, в котором выполняется текстовое поле.

1 голос
/ 20 января 2011

IntelliSense показывает это без проблем. Я не знаю, какая у тебя проблема?

        TextBox test = new TextBox();
        if (test.InvokeRequired)
        {
            test.BeginInvoke(...);
        }

Вышеупомянутое должно работать, может быть, вам стоит взглянуть на http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

Редактировать: Чтобы прояснить несколько вещей - test здесь ваш TextBox, значение которого следует изменить. Если у вас нет доступа к TextBox в вашем классе, мне нравится использовать события для запуска метода в вашем классе графического управления. Но это уже другая история;)

0 голосов
/ 20 января 2011

Если вы хотите, чтобы ваш класс предоставил какой-то механизм уведомлений, вам действительно нужно событие , чтобы не обновлять пользовательский интерфейс напрямую. В контексте приложения WinForms вы можете обработать это событие из вашей формы и выполнить любую Invoke / BeginInvoke работу там.

Надеюсь, это имеет смысл. Если нет, попробуйте поискать события .NET, чтобы понять, как они работают.

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

0 голосов
/ 20 января 2011

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

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