0

私のソリューションでは、ボタンクリックで単語の自動化が開始されるユーザーインターフェイスを取得しました(そのボタンをwordStartと呼びましょう)。この単語オートメーションを別のボタンクリックで中断したいと思います (そのボタンを wordBreak と呼びましょう)。

しかし、wordStart をクリックすると、作業中にユーザー インターフェイスがフリーズし、wordBreak ボタンをクリックできなくなります。私はまだプログラミングに少し慣れていないので、これはアプリケーションがシングルスレッドであるか、少なくともマルチスレッドで解決できるためであるに違いありません。

したがって、これは 2 in 1 の質問です。1. シングル スレッド アプリケーションでコードの実行を停止することは可能ですか? 2. コードの実行を停止するにはどうすればよいですか?

質問番号2については、インターネットを少し調べたところ、うまくいくと思われるこれらの方法が見つかりましたが、他の提案は大歓迎です:

Application.Exit

Application.Shutdown

Environment.Exit

編集:これはマルチスレッドで行うべきだと思った。私はそれについてあまり経験がないので、誰かがここで私を助けたい場合は、このコードを質問に追加しました。それまでの間、私はこれに対する解決策を自分で探します。

    private void generateButton_Click(object sender, EventArgs e)
    {
        //Thread or backgroundworker should handle this event?
        commandsChosed(); //Event to be throwed - this starts the word automation
    }

    private void stopButton_Click(object sender, EventArgs e)
    {
        //Stop/pause the working thread
    }
4

2 に答える 2

0

誰かが同様の問題を抱えている場合に備えて、ここに自分の質問への回答を投稿したかっただけです。この質問で他の人が示唆したように、クリップボードなどの使用などの OLE 関数が許可されていないため、バックグラウンドワーカーで実装できませんでしたが、これは私のスレッドが処理しているものに固有のものです。バックグラウンドワーカーは、多くの状況で間違いなく役立ちますが、スレッドプールからのものであるため、STA に設定することはできません。

Thread workerThread;

private void generateButton_Click(object sender, EventArgs e)
    {
        generateButton.Visible = false;
        stopButton.Visible = true;

        //Setting up a background thread
        workerThread = new Thread(new ThreadStart(handleGenerateButtonClick));
        workerThread.SetApartmentState(ApartmentState.STA); //In STA state the thread can use OLE functions like clipboard and handle some UI components as well.
        workerThread.IsBackground = true; //It shuts down if the mainthread shuts down
        workerThread.Start();

        try
        {
            //Checking whether the currentThread is not the workerThread before blocking the currentThread until workerThread has terminated
            if (Thread.CurrentThread != workerThread)
            {
                //Wait until workerThread has terminated
                workerThread.Join();
            }
            //Sets the window buttons after workerThread has finished
            if (!workerThread.IsAlive)
            {
                generateButton.Visible = true;
                stopButton.Visible = false;
            }
        }
        catch
        {
        }
    }

    private void stopButton_Click(object sender, EventArgs e)
    {
        generateButton.Visible = true;
        stopButton.Visible = false;

        //Stops the worker thread
        workerThread.Abort();
    }
于 2014-10-01T12:20:19.970 に答える
0

いいえ、単一のスレッドのみを使用すると、実行が完了するまでブロックされます。キャンセル/一時停止できるようにする場合は、操作に別のスレッドを使用する必要があります。たとえば、 を使用できますBackgroundWorker

于 2014-09-30T11:54:02.220 に答える