11

さらに編集 する以下は本番コードではありません-スレッド内でプロセスを実行する方法を理解しようとしているいくつかのクラスで遊んでいます-またはそれが実行可能であっても。私は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();
    }
}

なぜ2番目は最初と同じことをしないのですか?2番目のスクリプトではProcess.Start、Threadstartデリゲートを使用して渡そうとしています...これはvoidメソッドとしては問題ないと思いましたか?最初のスクリプトが唯一のオプションですか、それとも最初のスクリプトと同じ仕事を効果的に行うように、つまり指定されたスレッドでメモ帳のインスタンスを開始するように、2番目のスクリプトを少し変更できますか?


編集

私がこのコードで遊んでいる理由に関するいくつかの背景:最終的には、複数のExcelプロセスを同時に実行するアプリケーションを構築する必要があります。これらのプロセスは、VBAエラーが発生するとダイアログボックスが表示されるため、面倒な場合があります。したがって、各プロセスがスレッドで実行されている場合、特定のスレッドが長時間実行されている場合は、スレッドを強制終了できると思いました。私はスレッド/プロセスの初心者なので、基本的に現時点で可能性を試してみます。

4

5 に答える 5

28

AThreadStartは、を返すデリゲートを期待しますvoidProcess.Startを返すboolため、互換性のある署名ではありません。次のように、正しい戻り型(つまり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....
    });

もちろん、プロセスは新しいプロセス(完全に別個のスレッドの束)で開始されるため、スレッドで開始することは完全に無意味です。

于 2013-01-22T09:45:57.847 に答える
7

次のような変更を加えることができます

ThreadStart ths = new ThreadStart(delegate() { pr.Start(); });
于 2013-01-22T09:56:25.517 に答える
3

次のコードを使用して、通常どおりプロセスを開始します。

Process.Start("notepad.exe");

新しいプロセスを実行するスレッドを作成しても意味がありません。「cmd.exe」を直接実行できるのに、「cmd.exe」を実行するバッチファイルを実行するようなものです...無駄に必要以上のことをしているだけです。車輪を再発明するのではなく、簡単にプレイしてください :P

于 2013-01-22T09:50:13.847 に答える
1

次のコードのように start キーワードを使用して、別のスレッドでプロセスを開始できます。

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

この方法では、メモ帳を実行しても GUI プログラムがフリーズしません。

于 2019-11-26T07:32:38.567 に答える