2015-04-22 74 views
0

我有一個應用程序,將從SQL查詢到的項目添加到我的主WPF窗體上的列表框中。查詢需要很長時間,所以我將它添加到自己的線程中。我有另一個線程,顯示一個新的表單,請等待gif動畫。從任何窗體或線程停止線程

所以我總共有3個主題。

  1. 線程中運行SQL查詢主界面線程 - 線程命名SQL_THREAD

  2. 線程打開/顯示新實例的請稍候形式就可以了GIF動畫。 - 線程名please_wait_thread

我想取消線程的能力,從運行上please_wait_thread一個取消按鈕的SQL查詢,顯示形式有請稍候GIF動畫。

我很難理解繼承以及如何在表單之間引用對象。我知道如何創建它們的新實例,但不讓它們通信。

如果我把下面的代碼放在please_wait表單中並輸入sql_thread,它就看不到sql線程。

public void Cancel_btn_Click(object sender, EventArgs e) 
{ 
    sql_thread.abort(); 
} 

當我關閉please_wait表單時,如何停止它的軌道中的sql_thread?

在主表單上創建sql_thread的代碼如下。

private void btn_search_Click(object sender, EventArgs e) 
{ 
    Thread sql_thread = new Thread(sql_search_method); 
} 

P.S.我已經嘗試過一個背景工作,但它沒有工作,一旦碰到長查詢,就沒有辦法阻止它,直到它完成一個背景工作。

+2

首先,您應該使用DbContext對象,而不是手動管理您自己的線程以進行數據庫調用... – Codeman

+0

使用'Task'和'CancellationToken'(iirc)。 – IAbstract

+0

很高興知道,您是否有如何使用表單「B」中的CancellationToken取消表單「A」上的任務的示例?表格之間的交流似乎是我最大的擔憂。 –

回答

0

您是否嘗試將SQL線程作爲公共靜態線程或線程列表存儲在使用它的類之一中?那麼你應該能夠從你需要的任何環境中訪問它。只要你不使用線程來操縱自己,你應該沒問題。

雖然@ pheonixblade9指出,.NET框架已經有這樣做的工具,並且調查DbContext類是否適合您的目的是一個好主意。