所以我不知道如何问这个问题,这可能是我在任何地方都找不到答案的原因之一。
所以我的设置是我有一堂课
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());
}
}
在我的主类中,我实例化了一个新的 Connection 并调用 Login,这会在 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?