簡體   English   中英

如何在第一個表單的相同線程上打開第二個表單?

[英]How to open a second form on the same thread of the first form?

我有2種形式的WinForms客戶端。 第一種形式調用一個單獨的類,該類使用'SignalR'來接收來自WebApi的通知。 該類中特定消息的中心代理的設置為:

onResult = myProxy.On<int>("Result", (id) =>
{
    Result?.Invoke(this, new ResultEventArgs(id));
});

在第一種形式中,我訂閱Result事件,然后得到:

private void OnResult(object sender, ResultEventArgs e)
{
   using (var form = new SecondForm(e))
   {
       var dialogResult = form.ShowDialog(this);
       if (dialogResult == DialogResult.Cancel)
           return;
   }
}

我在var dialogResult = form.ShowDialog(this);上得到了CrossThreadException 第一個表單( this )在UI線程上打開。 第二種形式是在與SignalR類使用的相同線程中打開的。

我確實需要使用ShowDialog(this)打開第二個表單,因為我需要它成為應用程序中最頂層的表單。

有解決此問題的方法嗎? 是否可以在UI線程中打開第二個表單?

更新:

一種可行的解決方法:

form.TopMost = true;                   
form.StartPosition = FormStartPosition.CenterScreen;

唯一的缺點是該表單是桌面上最頂層的表單,而不僅僅是應用程序內部。

您不能在單個UI線程以外的任何線程上創建,更改或訪問任何UI控件。 您必須在現有控件上調用.Invoke(...) ,以將來自另一個線程的調用編組回UI。

嘗試這個:

private void OnResult(object sender, ResultEventArgs e)
{
    Action x = () =>
    {
        using (var form = new SecondForm(e))
        {
            var dialogResult = form.ShowDialog(this);
            if (dialogResult == DialogResult.Cancel)
                return;
        }
    };

    this.Invoke(x);
}

暫無
暫無

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

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