ここ数日、私は ASP.NET Web フォームとマルチスレッドを併用する方法を学ぶために、両方を使用して単純なアプレットを作成するという難しい方法を学ぼうとしていましたが、異なるスレッドと UI 間の相互作用の側面に苦労していました。
他のいくつかの質問でいくつかのマルチスレッドの問題を解決しました (また、あまりにも長い間、Web フォームと WPF が同じではないことを学びました) が、取得したデータに基づいて UI 要素を更新する最良の方法を見つけるのに苦労しています。複数のスレッドで。
これが私のコードです:
デフォルト.aspx
public partial class _Default : System.Web.UI.Page
{
private NlSearch _search;
private static int _counter = 0;
private static SortedList<long, SearchResult> resultsList = new SortedList<long, SearchResult>();
protected void Page_Load(object sender, EventArgs e)
{
_search = new NlSearch();
}
protected void AddSearchMethod(object sender, EventArgs e)
{
var text = SearchForm.Text;
new Task(() => MakeRequest(text));
}
protected void UpdateMethod(object sender, EventArgs e)
{
resultsLabel.Text = "";
foreach (var v in resultsList.Values)
{
resultsLabel.Text += v.SearchTerm + ": " + v.Count + " occurances<br/>";
}
}
protected void ClearSearchMethod(object sender, EventArgs e)
{
resultsLabel.Text = "";
resultsList.Clear();
}
protected void MakeRequest(string text)
{
_counter++;
SearchResult s = new SearchResult
{
SearchTerm = text,
Count = _search.MakeRequests(text)
};
resultsList.Add(_counter, s);
}
}
私は同じ基本的なことのかなりの数のバージョンを試しました。NlSearch.MakeRequest (MakeRequests によって呼び出される) は、HTTP POST 要求を外部の Web サイトに送信して、検索バーの入力を模倣し、返された結果の数を示す整数をマークアップから抽出します。
現在のシンプルな UI は、SearchForm テキスト フィールド、[検索の追加] ボタン、[ラベルの更新] ボタン、[検索のクリア] メソッド、および結果を表示する ResultsLabel を中心に展開しています。AddSearch ボタンは、MakeRequest を呼び出す新しいタスクを作成します。このタスクはメソッドを呼び出して HTTP 要求を送信し、送信された順序で結果を静的な並べ替えリストに格納します。
したがって、理想的には、優れたUIでは、スレッドが戻るたびにラベルを更新したいと思いますが、ContinueWhenAllと他のいくつかのタスク関数を使用してみましたが、問題は他のスレッドが変更できないことですUI。
ページの読み込み時に、数秒ごとにラベルを更新する新しいスレッドを実行しようとしましたが、これも同様に失敗しました。
これを正しく実装できなかったので、「ラベルの更新」ボタンを使用する必要がありました。これは、ラベルに現在静的リストにあるものを表示するように指示するだけです。このボタンを本当に取り除きたいのですが、スレッドで UI を変更する方法がわかりません。