我需要在單獨的線程中調用類方法。該方法有一個參數和一個返回值。獨立線程調用方法
詳細
我有兩個文本框表單。用戶把值在第一個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?
如果你可以使用.Net 4,那麼你應該肯定使用TPL(System.Threading.Tasks)。這也可以讓你跟蹤任何未完成的任務並更容易地取消它們。 例如,用戶在文本框中輸入「abcd」,並將任務引發到wiki。 在完成之前,用戶輸入「efgh」。 如果「efgh」查找完成* first *,那麼它將填充結果,這些將被「abcd」搜索覆蓋。 – Ragoczy 2012-02-20 14:51:00