私のアプリケーションは WebRequest を使用して Web ページからデータをフェッチすることがよくありますが、フェッチ中にボタンなどをクリックすることはできません。スレッド/バックグラウンドワーカーを使用する必要があることは理解しましたが、正しく機能させることができません。GUI の応答性が向上するわけではありません。
アプリケーションが応答しなくなるのを防ぐために、ある種のスレッド化を適用したいコード:
public string SQLGet(string query)
{
string post = "q=" + query;
WebRequest request = WebRequest.Create("http://test.com");
request.Timeout = 20000;
request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(post);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
requestStream = response.GetResponseStream();
StreamReader reader = new StreamReader(requestStream);
string ret = reader.ReadToEnd();
reader.Close();
requestStream.Close();
response.Close();
return ret;
}
編集:ありがとう、lc、私はそれにかなり似たものを試しました。しかし、そのようにバックグラウンドワーカーを使用することに関する私の問題は次のとおりです。(私の場合は SQLGet、あなたの場合は) StartQuery を呼び出した関数に queryResult を戻すにはどうすればよいですか?
私の例では、返された文字列は、文字列が内部で呼び出される void のローカル変数として使用されます。
また、同時に多くのクエリが存在する可能性があるため、グローバル変数に割り当てるリスクを冒したくありません。