検索ボタンをクリックするたびに tabPages を追加する tabControl があります。tabControl オブジェクトには、MouseDown のイベント ハンドラーもあり、マウスが特定のタブの上に移動してクリックしたときにタブを閉じることができます。また、tabcontrol_MouseDown メソッドは、検索ボタンをクリックしたときに開始されたタスクをキャンセルします。これにより、タスクは、その resultData を持つ tabControl から削除された tabPage で更新しようとしません。
以下のコードの問題は、それcts
がオブジェクト変数であるため、新しい CancellationTokenSource で新しいタブを作成するたびに上書きされることです。これは、1 つの tabPage を tabControl に追加するだけでよい場合に機能しますが、多数追加する必要があります。
searchButton_Click メソッド内でキャンセル トークンを定義して作成し、tabControl_MouseDown にそれへの参照を見つけさせる方法はありますか、またはこれを解決できる別の方法はありますか?
public class Form1 : Form {
CancellationTokenSource cts;
private async void searchButton_Click(object sender, EventArgs e){
cts = new CancellationTokenSource();
tabControl1.TabPages.Add(new TabPage());
var resultData = await Task.Run(() => SlowMethod());
if (!cts.Token.IsCancellationRequested) { /* add resultData to tabPage */ }
}
private void tabControl_MouseDown(object sender, MouseEventArgs e){
// - I select the tab being hovered with mouse
// - I remove the tab from tabControl
cts.Cancel();
}
}