Мне нужно вызвать метод класса в отдельном потоке. У метода есть параметр и возвращаемое значение.
Детали
У меня есть форма с двумя текстовыми полями. Пользователь помещает значение в первый TextBox и получает результат во второй:
private void tbWord_TextChanged(object sender, TextChangedEventArgs e)
{
tbResponce.Text = Wiki.DoWork(tbWord.Text);
}
Вики-класс должен использовать API Википедии:
public class Wiki
{
private class State
{
public EventWaitHandle eventWaitHandle = new ManualResetEvent(false);
public String result;
public String word;
}
private static void PerformUserWorkItem( Object stateObject )
{
State state = stateObject as State;
if(state != null)
{
Uri address = new Uri("http://en.wikipedia.org/w/api.php?action=opensearch&search=" + state.word);
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
HttpWebResponse responce = (HttpWebResponse)request.GetResponse();
StreamReader myStreamReader = new StreamReader(responce.GetResponseStream(), Encoding.GetEncoding(1251));
state.result = myStreamReader.ReadToEnd();
state.eventWaitHandle.Set();
}
}
public static String DoWork(String _word)
{
State state = new State();
state.word = _word;
ThreadPool.QueueUserWorkItem(PerformUserWorkItem, state);
state.eventWaitHandle.WaitOne();
return state.result;
}
}
Задача
Когда пользователь нажимает клавиши в tbWord, основная форма останавливается и ждет, пока класс Wiki сделает всю работу.
Как я могу запустить DoWork асинхронно?