2017-03-09 36 views
0

我有一個沒有源代碼的第三方DLL接受文件頁面數組和返回書籍對象。該dll有一個函數Ge​​nerateBook(Page []頁面),在BackgroungWorker下執行。如何在不使用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; 
      } 
     } 
    } 
+0

不要使用這種過時的類。使用TPL和'取消令牌'來完成這些任務。另外,中止這個線程總是**一個壞主意。 – VMAtm

回答

相關問題