首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用DoWorkEventArgs Cancel属性的情况下强制中止BackgroundWorker创建的线程?

如何在不使用DoWorkEventArgs Cancel属性的情况下强制中止BackgroundWorker创建的线程?
EN

Stack Overflow用户
提问于 2017-03-09 18:59:56
回答 1查看 45关注 0票数 0

我有一个没有源代码的第三方dll,它接受文件,页面,数组和返回图书对象。该动态链接库有一个在BackgroungWorker下执行函数GenerateBook(Page[] pages)。

如果用户按下abort按钮,进程应停止生成帐簿。使用cancelAsync(),我可以向BackgroundWorker线程进程发送取消请求。但是GenerateBook(Page[] pages)是第三方函数,所以我不能在其中使用e.cancel。

现在,在这个场景中,如何立即中止后台工作进程?请给我提个建议。现在我正在使用下面的代码。但这是行不通的。

代码语言:javascript
复制
    public class AbortableBackgroundWorker : BackgroundWorker
    {
        public delegate void ErrorEventHandler(string message, ReportRunStatus status);
        public event ErrorEventHandler foundError;
        public Thread workerThread { get; set; }
        private bool isFromAbort;

        protected override void OnDoWork(DoWorkEventArgs e)
        {
            workerThread = Thread.CurrentThread;
            try
            {
                base.OnDoWork(e);
            }
            catch (Exception ex)
            {
                if (!isFromAbort)
                {
                    if (foundError != null)
                        foundError(ex.Message.ToString(), ReportRunStatus.Error);
                }
                e.Cancel = true;
                this.Dispose();
            }
        }

        public void Abort()
        {
            if (workerThread != null)
            {
                isFromAbort = true;
                workerThread.Abort();
                workerThread = null;
            }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2017-03-09 19:39:09

您可以尝试使用BeginInvoke和EndInvoke进行异步调用。参考链接中给出的方法之一应该可以解决这个问题。

https://support.microsoft.com/en-us/help/315582/how-to-call-a-visual-c-method-asynchronously

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42693571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档