Понимание многопоточности, делегатов и статики - PullRequest
0 голосов
/ 19 декабря 2009

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

Вот что у меня получилось (упрощенно для одного результата TextBox. В моем маленьком проекте я разбил слова на 4 разных TextBox в зависимости от длины слова).

static string _challengeString;
static string[][] _categorizedWords = new string[26][];
Thread _letterSearch = new Thread(new ParameterizedThreadStart(_SearchForWords);

public MainForm()
{
   // do the work to load the dictionary into the _categorizedWords variable
   // 0 = A, 1 = B, .., 24 = Y, 25 = Z;

   // build the form which contains:
   // 1 TextBox named _entryChars for user entry of characters
   // 1 Button named _btnFind
   // 1 TextBox named _Results
   InitializeComponent;  

}

private void FindButton_Click(object sender, EventArgs e)
{
   _letterSearch.Abort();
   _letterSearch.IsBackground = true;
   _challengeString = _entryChars.Text;

   _Results.Text = "";

   for (int letterIndex = 0; letterIndex < 26; letterIndex++)
   {
      _letterSearch.Start(letterIndex);
   }
   _entryChars.Text = "";
}

static void _SearchForWords(object letterIndex)
{
   Regex matchLetters = new Regex( _challengeString, RegexOptions.IgnoreCase | RegexOptions.Compiled );

   foreach (string word in _categorizedWords[(int)letterIndex])
   {
      if ( matchLetters.Match(word).Success )
      {
         _InsertWord(word);
      }
   }
}

delegate void InsertWord(string word);
public static void _InsertWord(string word)
{
   _Results.Text += word + "\n";
}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь передать слово обратно в функцию делегата _InsertWord и присвоить его _Results.Text, он дает мне «Ссылка на объект требуется статическое поле, метод или свойство "сообщение на _Results.Text. Я не уверен, что он хочет, чтобы я сделал.

Я ценю помощь!

1 Ответ

2 голосов
/ 19 декабря 2009

Проблема в том, что _Results является членом экземпляра, но поскольку ваш метод _InsertWord является статическим, не существует неявного экземпляра - нет «this» для разрешения _Results. (Это может быть понятнее, если вы читаете _Results как this._Results - вам не нужно записывать это, потому что компилятор вставляет «this» для вас, когда выясняет, что _Results ссылается на член экземпляра - но это может помочь вам быть более ясным в вашем уме.)

Поэтому самое простое решение - создать методы экземпляра _InsertWord и _SearchForWords, чтобы они могли иметь доступ к элементам экземпляра, таким как _Results. Однако обратите внимание, что если вы сделаете это, вам потребуется использовать Control.BeginInvoke или Control.Invoke для обновления текста, потому что _InsertWord выполняется в потоке, отличном от того, в котором есть текстовое поле _Results.

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