Вы звоните BeginInvoke
, поэтому ваш делегат вызывается в потоке пула потоков. Вы не можете получить доступ к интерфейсу из этого потока пула потоков; вам нужно вызвать Invoke
или BeginInvoke
на элементе управления, чтобы затем использовать результаты в потоке пользовательского интерфейса. Например, используя анонимный метод:
txtSearch.BeginInvoke((MethodInvoker) delegate()
{ txtSearch.Text = result.TotalResults.ToString(); }
);
Или с помощью лямбда-выражения и с отдельной локальной переменной просто для ясности:
MethodInvoker action= () => { txtSearch.Text = result.TotalResults.ToString();};
txtSearch.BeginInvoke(action);
Использование Invoke
сделает блок вызывающего потока, пока поток пользовательского интерфейса не вызовет делегата; BeginInvoke
неблокирует.
РЕДАКТИРОВАТЬ: Если проблема в том, что result.TotalResults
это бит, который занимает много времени, сделайте этот бит все еще в фоновом потоке:
string text = result.TotalResults.ToString();
txtSearch.BeginInvoke((MethodInvoker) delegate() { txtSearch.Text = text; });