簡體   English   中英

如何生成一個表單而不阻塞主線程?

[英]How to spawn a form and not block main thread?

我需要產生一個可以照常使用的Form ,但是主線程必須繼續執行隨后要做的任何事情。 當我嘗試以下2種技巧時,我無法使用該表格:

static class Program
{
    private static void spawnForm1()
    {
        new Form1().Show();
    }

    private static void spawnForm2()
    {
        // solved: use ShowDialog() instead of Show() here
        ThreadPool.QueueUserWorkItem(o => { new Form1().Show(); });
    }

    [STAThread]
    static void Main()
    {
        spawnForm1();
        MessageBox.Show("main thread continues");
        // now anything can happen: background processing or start of main form
        // sleeping is just an example for how the form is unresponsive
        Thread.Sleep(30 * 1000);
    }
}

那么,如何生成一個簡單的Form並在主線程中繼續呢? 它應該像消息框一樣響應。

(我不能使用Application.Run(...);如果它會阻塞主線程,我也不能使用ShowDialog() ,另外:很抱歉,我的聲譽不高,但這不是菜鳥問題,我真的需要像我試圖解釋的那樣生成它)

不要創建新線程來顯示UI。 您位於UI線程中,應該是顯示表單的線程。 產生一個新線程來執行您要執行的非UI工作:

[STAThread]
static void Main()
{
    Task.Run(()=>
        {
            //do non-UI work here
            Thread.Sleep(30 * 1000);
        });
    Application.Run(new Form1());
}

您的代碼不起作用,因為沒有消息循環。 您僅需啟動一個消息循環,UI元素才能正常運行。 這意味着您必須在某個時候調用Application.RunForm.ShowDialog

我認為沒有理由為什么不能在UI上使用入口點線程,然后創建一個工作線程來執行UI運行時想要執行的其他任何操作。

[STAThread]
public static void Main()
{
  Task.Run(() => DoOtherStuff());
  Application.Run(new YourForm());
}

您在評論中寫道:

主窗口像往常一樣由應用程序運行。 但是我需要在現有主窗口和沒有主窗口的情況下生成一個像我描述的窗口。

我假設您的意思是要在入口點線程和單獨的線程上運行Form實例。 我的建議是避免這樣做。 它不能很好地工作。 可能會發生很多奇怪的事情。 重新考慮您的設計,以便只有一個UI線程。 將所有耗時的操作移至工作線程。

暫無
暫無

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

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