0

これは、実際の問題というよりも、「知りたい」種類の質問です。

スレッド化スキルの向上に取り組んでいるときに、次の難問に直面しています。

ソースコード

internal class Program
{
    private static void Main(string[] args)
    {
        var thread = new Thread(() => Print("Hello from t"));
        thread.Start();
        //thread.Join();
    }

    private static void Print(string message)
    {
        Console.WriteLine(message);
    }
}

問題

Visual Studio からアプリケーションを実行すると (デバッグ構成かリリース構成かに関係なく)、スレッドが終了するまで (を使用して) 待機しない限りmessage、[出力] ウィンドウに は表示されません。Join

ソリューション

コンパイルされた実行可能ファイルをコマンド プロンプトから実行すると、期待どおりの出力が表示されます。

私の質問

大げさな推測で、Visual Studio 環境がすべての違いを生むと言います。

私が疑問に思っているのは、実際のアプリケーションで作業している場合、Visual Studio を使用して、ソース コードを (使用するためにJoin)強制的に変更せずに、そのアプリケーションをデバッグするにはどうすればよいかということです。

4

2 に答える 2

2

呼び出しthread.Start()は、補助スレッドを開始してから戻ります。これでMain関数が終了するため、補助スレッドがメッセージを出力する前にプログラムが終了し、そのプロセスが終了します。

Visual Studio 環境について不思議なことは何もありません。通常の Windows プロセスの動作です。

于 2012-04-16T20:55:04.880 に答える
2

実際のアプリケーションでは、スレッドが完了する前にアプリが終了するという問題があるため、このコードは表示されません。この問題が発生した場合は、通常、コードに問題があることを示しています。

メッセージ ポンプ (WinForms) または同様の (WPF) を使用している場合、アプリケーションは通常どおり実行されます。つまり、ユーザー (またはアプリケーション) がアプリケーションの終了を要求してループを中断するまで、アプリケーションは終了しません。この場合、スレッドは終了するまで、またはプログラムが終了するまで動作します。Thread.Join()シナリオによっては、とにかく呼び出す必要がある場合があります。

コンソール アプリケーションを作成している場合はThread.Join()、プログラムの最後に を呼び出して、ワーカー スレッドが確実に完了するようにする必要があります。別の方法は、メッセージ ポンプを で開始することですSystem.Windows.Forms.Application.Run()。ただし、このように設計されていないため、ユーザーとやり取りする場合以外は使用しないでください。

別の側面として、C# にはフォアグラウンド スレッドとバックグラウンド スレッドの 2 種類のスレッドがあります。フォアグラウンド スレッドは、メイン スレッドが停止した後も実行を続けます。すべてのフォアグラウンド スレッドが完了すると、バックグラウンド スレッドが停止します。デフォルトのタイプはフォアグラウンド スレッドです。プロパティを使用して、スレッドをバックグラウンドに明示的に設定できThread.IsBackgroundます。Visual Studio は、フォアグラウンド スレッドがアプリケーションの終了を妨げないところまでスレッドをいじっているようです。デバッガの外でプログラムを実行すると、正常に動作します。

すべてのスレッドがメイン スレッドの前に終了することを確認することをお勧めします。終了後にさらに高度なコードを実行するとどうなるかは誰にもわかりませんMain

于 2012-04-16T20:55:19.363 に答える