0

イベントを生成するユーザー インターフェイスがあります。だから私は引数を持つ "ButtonPressed" などのイベントを持っています。イベントで、時間のかかる関数「GenerateTableData」を起動したい。また、インターフェイスをブロックしたくないので、この関数はバックグラウンド スレッドにある必要があります。この後、呼び出しをメイン スレッドに戻し、列にデータを入力できます。
しかし、ユーザーがボタンを 2 回押した場合、2 つのスレッドを作成したくありません。代わりに、前のボタンを中断するか、終了するまで待ってすぐに別のボタンを開始したい (別のボタンは別のデータでテーブルを埋め、最後に押されたボタンの結果のみを表示する必要がある)。

そして、私はそのオプションにこだわっています。私にはうまくいっているように見えますが、各イベントで backgroundworker をキャストしていますが、2 回以上の実行を防ぐことはできず、さらにイベントをキューに入れることもできません。

このタスクの解決策の例を教えてください。かなり一般的だと思います。

ここにいくつかの擬似コードがあります:

void Button1Pressed(args)
{
DoWork(1);
}
void Button2Pressed(args)
{
DoWork(2);
}

void DoWork(int i)
{
BackGroundWorker bg=new BackGroundWorker();
bg.DoWork+= (object sender, DoWorkEventArgs e) => {e.result=GenerateTable(i)};
bg.RunWorkerCompleted+= (object sender, RunWorkerCompletedEventArgs e) =>{InvokeOnMainThread(()=>{PopulateColumns(e.result)})};
bg.RunWorkerAsync();
}
void PopulateColumns(data)
{
myTable.PopulateWithData(data);
}
4

1 に答える 1