簡體   English   中英

如何在線程中啟動進程

[英]How to start a Process in a Thread


進一步編輯以下不是生產代碼 - 我只是在玩幾個類試圖弄清楚我如何在線程中運行進程 - 或者即使這是可行的。 我已經閱讀了 MSDN 上的各種定義,但我是線程和進程的新手,因此對文章的任何進一步明確引用將不勝感激


這可以...

class Program {
    static void Main(string[] args) {

        Notepad np = new Notepad();
        Thread th = new Thread(new ThreadStart(np.startNPprocess));
        th.Start();

        Console.WriteLine("press [enter] to exit");
        Console.ReadLine();
    }
}

public class Notepad {

    public void startNPprocess() {

        Process pr = new Process();
        ProcessStartInfo prs = new ProcessStartInfo();
        prs.FileName = @"notepad.exe";
        pr.StartInfo = prs;
        pr.Start();     

    }
}

這不是……

class Program {
    static void Main(string[] args) {


        Process pr = new Process();
        ProcessStartInfo prs = new ProcessStartInfo();
        prs.FileName = @"notepad.exe";
        pr.StartInfo = prs;

        ThreadStart ths = new ThreadStart(pr.Start);
        Thread th = new Thread(ths);
        th.Start();


        Console.WriteLine("press [enter] to exit");
        Console.ReadLine();
    }
}

為什么第二個和第一個不一樣? 在第二個腳本中,我試圖使用 Threadstart 委托傳遞Process.Start ......我認為這可以作為它的void方法嗎? 第一個腳本是唯一的選擇還是我可以稍微更改第二個腳本以便它有效地執行與第一個相同的工作,即在指定線程中啟動記事本實例?


編輯

關於為什么我玩這個代碼的一些背景:最終我需要構建一個將同時運行多個 Excel 進程的應用程序。 當 VBA 出錯時,這些過程會很麻煩,因為它會導致一個對話框。 所以我想如果每個進程都在一個線程中運行,那么如果一個特定的線程運行了太長時間,那么我可以殺死該線程。 我是線程/進程的新手,所以目前基本上是在嘗試各種可能性。

ThreadStart需要一個返回void的委托。 Process.Start返回bool ,因此不是兼容的簽名。 您可以通過使用 lambda 來吞下返回值,該 lambda 為您提供正確返回類型(即void )的委托,如下所示:

    Process pr = new Process();
    ProcessStartInfo prs = new ProcessStartInfo();
    prs.FileName = @"notepad.exe";
    pr.StartInfo = prs;

    ThreadStart ths = new ThreadStart(() => pr.Start());
    Thread th = new Thread(ths);
    th.Start();

...但可能建議檢查返回值:

    ThreadStart ths = new ThreadStart(() => {
        bool ret = pr.Start();
        //is ret what you expect it to be....
    });

當然,一個進程在一個新進程(一組完全獨立的線程)中啟動,所以在一個線程上啟動它是完全沒有意義的。

您可以進行更改,例如

ThreadStart ths = new ThreadStart(delegate() { pr.Start(); });

只需使用以下代碼正常啟動流程:

Process.Start("notepad.exe");

創建線程來運行新進程沒有任何意義和好處。 當您可以直接執行“cmd.exe”時,這就像運行一個執行“cmd.exe”的批處理文件……您所做的只是無所事事。 不要重新發明輪子並輕松玩:P

不直接回答 OP,但由於此線程幫助我跟蹤了正確的方向,我確實想回答這個問題:

“在線程上啟動它是完全沒有意義的”

我有一個使用 NodeJS 作為其 TCP 套接字管理器的 .Net 服務器。 我希望 NodeJS 寫入與 .Net 服務器相同的輸出,並且它們都並行運行。 所以在新線程中打開允許我使用

processNodeJS.BeginErrorReadLine()
processNodeJS.BeginOutputReadLine()
processNodeJS.WaitForExit()

同時不阻塞 .Net 服務器的主線程。

我希望它對某人有意義,如果您有更好的方法來實現我剛剛描述的內容,我會很高興聽到。

您可以使用如下代碼中的 start 關鍵字在另一個線程中啟動進程:

Process.Start("start notepad.exe");

這樣,當您運行記事本時,您的 GUI 程序不會凍結。

暫無
暫無

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

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