ファイルページの配列を受け取り、ブックオブジェクトを返すsource-codeのないサードパーティ製のDLLが1つあります。そのdllにはBackgroungWorkerの下で実行するGenerateBook(Page []ページ)という1つの関数があります。DoWorkEventArgsを使用せずにBackgroundWorkerによって作成されたスレッドを強制的に中止する方法プロパティを取り消しますか?
ユーザーが[中断]ボタンを押すと、プロセスは本の生成を停止する必要があります。 cancelAsync()を使用すると、キャンセル要求をBackgroundWorkerスレッドプロセスに送信できます。しかしGenerateBook(Page []ページ)はサードパーティの関数なので、その中で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;
}
}
}
古いクラスは使用しないでください。そのようなタスクにはTPLと 'Cancellation Token'を使います。また、スレッドを中止することは**常に**悪い考えです。 – VMAtm