所以我不知道如何提出這個問題,可能是我有問題找到答案的原因之一。使用COM對象鎖的UI的後臺工作仍然
所以我的設置是,我有一個類
public class Connection
{
public static event EventHandler LogggedIn;
public static TDConnection TDC {get;set;}
public string Authenticate(){...}
public static void Login()
{
if (Connection.TDC.Connected)
{
_bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bw.DoWork += ConnectToProject_DoWork;
_bw.RunWorkerCompleted += ConnectToProject_RunWorkerCompleted;
_bw.RunWorkerAsync(Connection.TDC);
}
}
private static void ConnectToProject_DoWork(object o, DoWorkEventArgs e)
{
Connection.TDC.ConnectProjectEx(Connection.Domain, Connection.Project, Connection.UserName, Utilities.Encryption.AESEncryption.Decrypt(Connection.Password, "fsd*#(dfs(((>>>???fdjs"));
}
private static void ConnectToProject_RunWorkerCompleted(object o, RunWorkerCompletedEventArgs e)
{
LogggedIn(null, new EventArgs());
}
}
在我的主I類實例化一個新的連接,並調用登錄這將打開TDConnection到ALM一個新的連接。在我的線程中,我想在我的線程中使用這個已經打開的連接。從我讀過的內容來看,如果我這樣做,我的UI將會被阻塞,因爲我在UI線程上使用成員的方法,即使我在後臺工作者的內部。
一個解決方案,我發現這樣做:
private static void ConnectToProject_DoWork(object o, DoWorkEventArgs e)
{
TDConnection conn = new TDConnection();
conn.InitConnectionEx(QCURL);
conn.Login();
conn.ConnectProject();
e.Result = conn;
}
我不想這樣做,因爲我已經登錄,它需要額外的時間來做到這一點。
我已經嘗試過使用_bw.RunorkerAsync(Connection.TDC)傳遞Connection.TDC,但這顯然不起作用。
有什麼辦法可以使用已經建立的連接,而不是在連接時阻止UI?
這裏沒有UI代碼。你是否從你的UI線程調用這個類的方法,直到後臺工作完成? – pstrjds
您的WorkerReportsProgress和Cancellation設置具有誤導性(因爲未使用)。 –
對不起。我正在使用Winform按鈕單擊事件處理程序中的Connection.Login。由於連接將在一個線程中打開,因此我建立了一個事件處理程序來觸發連接建立。因爲它是從我的Winform中調用的,所以它會阻止我的UI。 – Smeiff