0

我有一个耗时的功能,我想给用户一个机会,当他注意到它需要太长时间时,通过单击 UI 中的一个按钮来停止它。我怎样才能做到这一点?

4

5 回答 5

3

您可以使用BackgroundWorker类在其他线程上运行时间和资源消耗的东西,并使用它的CancelAsync方法来请求(它不是立即执行)取消其他线程。

有关如何实现该功能的具体示例,可以查看此问题中接受的答案:

如何等待 BackgroundWorker 取消?

于 2012-08-27T18:06:38.490 回答
1

首先,您需要在与主线程分开的线程中运行耗时的函数。否则 UI 将停止响应。

然后,您需要有一个静态变量或一个共享实例,其中 UI 可以设置一个标志,指示该耗时功能应该停止。

最后,耗时函数应该定期检查标志,如果设置了就停止处理。

BackgroundWorker类实现了这种模式并解决了一些其他需求(例如线程间通信和进度报告)。

于 2012-08-27T18:07:33.243 回答
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 回答
0

尝试在后台工作人员上运行它。

给出了如何使用它的一个很好的例子。

然后你可以打电话

Worker.CancelAsync(); 

当用户想要取消操作时

于 2012-08-27T18:07:37.317 回答
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 回答