2010-07-09 66 views
0

我有一個vb.net 2.0程序,它有一個批處理/隊列例程來執行需要很長時間的任務。其中一項任務是「上傳到FTP」的大文件。該隊列由用戶點擊「開始」按鈕啓動,然後一個for-loop僅運行每個批次項目,並執行所需的任何操作。如何爲批處理/隊列例程實現取消按鈕?

現在我想實現一個「取消隊列執行」按鈕。該按鈕應該是可點擊的(gui不能被被執行的隊列阻塞),並且該按鈕應該停止當前的隊列動作(我不關心以前執行的任務的回滾)。

我想我需要單獨的線程和某種通知方案,但在什麼時候應該檢查通知是否被髮送?在隊列的for循環?但是,那麼用戶將不得不等待在休息之前完全上傳文件,這不是他想要的。在「文件上傳」方法中?在一種方法中,代碼太多了,我感覺很直觀。

我還需要做一些清理當前批處理項的操作(如刪除部分上傳的文件),因此必須在某處進行分解。

高級代碼或示例中的任何建議?提前致謝!

回答

0

一種解決方案是創建一個線程,該線程執行您希望取消的任何操作,然後在您希望它消失時放棄它。

// this thread does the cancellable work 
Thread actor; 

// this is a very simple example, yours will be more complex 
public void PerformAction(){ 
    if(actor != null) // this sample code is not reentrant 
    throw new InvalidOperationException("lol"); 
    actor = new Thread(Work); 
    actor.Start(); // async 
} 

// awesome code, dude 
private void Work(object state) 
{ 
    ImpressiveLibrary.MethodsThatLastForever.DoSomethingAmazing(); 
} 

// kills the actor, if it is not null. 
// reentrant, but not thread safe. Can you figure out why? 
public void KillAction(){ 
    var foo = actor; 
    actor = null; 
    if(foo != null) 
    foo.Abort(); 
}