gpt4 book ai didi

c# - 在按钮单击事件中中止长时间运行的线程

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:02 25 4
gpt4 key购买 nike

在我的 WPF 应用程序中,我有一个长时间运行的进程,它使用 BlueBeam Q Server 将文件转换为 PDF。当这个过程发生时,它不应该卡住,所以编写了下面的代码来处理这个问题:

private void btn_convert_Click(object sender, RoutedEventArgs e)
{
thread = new Thread(new ThreadStart(WorkerMethod));
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Name = "PDF";
thread.Start();
}

WorkerMethod()
{
//code to connect to Q server and conversion goes here
}

现在,当流程开始时,用户将看到一个取消按钮。当用户按下取消时,我想中止启动的线程。我写的代码如下:

private void btn_cancel_Click(object sender, RoutedEventArgs e)
{
if (thread.Name == "PDF")
thread.Abort();
}

但是线程并没有中止并继续这个过程。请给我您宝贵的建议。

最佳答案

您应该尽可能避免Abort。在 SO 中搜索如何优雅地取消线程 - 当线程代码调用您无法影响的其他代码时无法完成,例如第三方库方法或类似的东西。

例如,如果您的线程方法执行如下操作:

WorkerMethod()
{
CallFunctionInExternalDLL();
}

无法正常中止。

要“取消”这样的线程,最好向线程指示它应该取消(例如,使用 bool 标志)并让线程回滚其结果(例如,删除创建的 PDF 或类似的东西)。然后,您的应用程序可以继续运行,就好像线程从未启动过一样。

例如,您的代码可能如下所示:

WorkerMethod()
{
CallFunctionInExternalDLL();
if (m_threadAborted)
RollBackWhatFunctionDid();
}

如果您的线程看起来像这样:

WorkerMethod()
{
while (true)
{
CallFunctionInExternalDLL();
}
}

你可以这样做:

WorkerMethod()
{
while (!m_threadAborted)
{
CallFunctionInExternalDLL();
}

if (m_threadAborted)
RollBackStuff();
}

在这些示例中,m_threadAborted 是一个 bool 标志,声明如下:

private volatile bool m_threadAborted = false;

关于c# - 在按钮单击事件中中止长时间运行的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15637548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com