是否可以停止从UI单线程执行代码?

时间:2014-09-30 11:50:25

标签: c# wpf multithreading single-threaded

在我的解决方案中,我得到了一个用户界面,通过按钮点击启动一些单词自动化(让我们调用该按钮wordStart)。我想用另一个buttonclick打破这个词自动化(让我们调用那个按钮wordBreak)。

然而,当我点击wordStart时,用户界面在执行工作时冻结,我无法单击wordBreak按钮。 我对编程还有点新意,所以对我来说这必须是因为应用程序是单线程的,或者至少我可以通过多线程解决它。

所以这是一个二合一的问题。 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
    }

2 个答案:

答案 0 :(得分:0)

不,通过仅使用单个线程,它将被阻塞,直到执行完成。如果您希望能够取消/暂停它,则需要使用另一个线程进行操作。例如,您可以使用BackgroundWorker

答案 1 :(得分:0)

我想在这里发布我自己的问题的答案,以防有人遇到类似的问题。 正如其他人在这个问题上所建议的那样,我无法用backgroundworker实现它,因为它不允许使用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();
    }