我有一个没有源代码的第三方dll,它接受文件,页面,数组和返回图书对象。该动态链接库有一个在BackgroungWorker下执行函数GenerateBook(Page[] pages)。
如果用户按下abort按钮,进程应停止生成帐簿。使用cancelAsync(),我可以向BackgroundWorker线程进程发送取消请求。但是GenerateBook(Page[] pages)是第三方函数,所以我不能在其中使用e.cancel。
现在,在这个场景中,如何立即中止后台工作进程?请给我提个建议。现在我正在使用下面的代码。但这是行不通的。
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;
}
}
}发布于 2017-03-09 19:39:09
您可以尝试使用BeginInvoke和EndInvoke进行异步调用。参考链接中给出的方法之一应该可以解决这个问题。
https://support.microsoft.com/en-us/help/315582/how-to-call-a-visual-c-method-asynchronously
https://stackoverflow.com/questions/42693571
复制相似问题