時間のかかる機能があり、ユーザーが時間がかかりすぎることに気付いたときに、UI のボタンをクリックして停止する機会をユーザーに提供したいと考えています。これどうやってするの?
5 に答える
BackgroundWorkerクラスを使用して、他のスレッドで時間とリソースを消費するものを実行し、そのCancelAsyncメソッドを使用して、他のスレッドのキャンセルを要求できます(即時実行ではありません)。
それを実装する方法の具体的な例については、この質問で受け入れられた回答を見ることができます:
時間のかかるメソッドが呼び出されたとしましょうMyTimeConsumingMethod
。
void MyTimeConsumingMethod()
{
//Do stuff
}
スレッドをグローバルに置く:
Thread t;
Form_Load() に入れます
t = new Thread(new ThreadStart(MyTimeConsumingMethod));
t.Start();
ボタンを押すと:
t.Abort();
まず、時間のかかる関数をメイン スレッドとは別のスレッドで実行する必要があります。そうしないと、UI が応答しなくなります。
次に、時間のかかる関数を停止する必要があることを示すフラグを UI が設定できる静的変数または共有インスタンスが必要です。
最後に、時間のかかる関数はフラグを定期的にチェックし、フラグが設定されている場合は処理を停止する必要があります。
BackgroundWorkerクラスはこのパターンを実装し、他のいくつかの要件 (スレッド間通信や進行状況レポートなど) も解決します。
これが例です
bool _cancel = false;
private void count()
{
_cancel = false;
new System.Threading.Thread(delegate()
{
for (int i = 0; i < 100000; i++)
{
if (_cancel)
break;
Console.WriteLine(i);
}
}).Start();
}
private void button1_Click(object sender, EventArgs e)
{
_cancel = true;
}
バックグラウンド ワーカーで実行してみてください。
これは、使用方法の良い例です。
その後、あなたは呼び出すことができます
Worker.CancelAsync();
ユーザーが操作をキャンセルしたい場合