簡體   English   中英

使用COM對象的后台工作者仍然鎖定UI

[英]Background worker using COM object locks UI still

所以我不知道怎么問這個問題,這可能是我在任何地方都找不到答案的原因之一。

所以我的設置是我有一堂課

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?

這在COM對象中很常見。 就像.NET類一樣,許多COM協類也不是線程安全的。 在.NET中,如果您以不安全線程的方式使用.NET類,則您將無法自拔。 不在COM中,它保證將以線程安全的方式使用廣告自己為非線程安全的coclass。

它通過自動將方法調用從工作線程編組到創建對象的線程來完成。 您可以看到結果,您在主線程上創建了TDC對象。 所以,當你從BackgroundWorker的調用它,它仍將執行主線程中調用。

解決此問題的唯一方法是在使用對象的同一線程上創建對象。 這通常也意味着您不能使用BackgroundWorker,您很可能需要創建一個Thread並調用其SetApartmentState()方法以將其切換為STA。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM