0

時間のかかる機能があり、ユーザーが時間がかかりすぎることに気付いたときに、UI のボタンをクリックして停止する機会をユーザーに提供したいと考えています。これどうやってするの?

4

5 に答える 5

3

BackgroundWorkerクラスを使用して、他のスレッドで時間とリソースを消費するものを実行し、そのCancelAsyncメソッドを使用して、他のスレッドのキャンセルを要求できます(即時実行ではありません)。

それを実装する方法の具体的な例については、この質問で受け入れられた回答を見ることができます:

BackgroundWorker がキャンセルされるのを待つ方法は?

于 2012-08-27T18:06:38.490 に答える
1

時間のかかるメソッドが呼び出されたとしましょうMyTimeConsumingMethod

void MyTimeConsumingMethod()
{
       //Do stuff
}

スレッドをグローバルに置く:

Thread t; 

Form_Load() に入れます

t = new Thread(new ThreadStart(MyTimeConsumingMethod));
t.Start();

ボタンを押すと:

t.Abort();
于 2012-08-27T18:09:13.773 に答える
1

まず、時間のかかる関数をメイン スレッドとは別のスレッドで実行する必要があります。そうしないと、UI が応答しなくなります。

次に、時間のかかる関数を停止する必要があることを示すフラグを UI が設定できる静的変数または共有インスタンスが必要です。

最後に、時間のかかる関数はフラグを定期的にチェックし、フラグが設定されている場合は処理を停止する必要があります。

BackgroundWorkerクラスはこのパターンを実装し、他のいくつかの要件 (スレッド間通信や進行状況レポートなど) も解決します。

于 2012-08-27T18:07:33.243 に答える
0

これが例です

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;
}
于 2012-08-27T18:06:29.837 に答える
0

バックグラウンド ワーカーで実行してみてください。

これは、使用方法の良い例です。

その後、あなたは呼び出すことができます

Worker.CancelAsync(); 

ユーザーが操作をキャンセルしたい場合

于 2012-08-27T18:07:37.317 に答える