11

デフォルトでは、.NETのスレッドプールはバックグラウンドスレッドで動作します。

フォアグラウンドとして実行するように変更することはできません。

これをフォアグラウンドスレッドとして実行するように変更するにはどうすればよいですか?

編集:

大量の処理のためにアプリを変更しているため(デフォルトではフォアグラウンドスレッドであるスレッドを手動で処理する前)、これを使用する必要があります。アプリケーションをバックグラウンドに適応させるためだけに変更したくないためです。スレッドシナリオ。

スレッドプールがデフォルトでフォアグラウンドではないのはなぜだろうか

4

3 に答える 3

19

「バックグラウンドスレッド」の概念は、.NETではほとんど意味がありません。Thread.IsBackgroundプロパティは、AppDomainがアンロードされたときにスレッドを無礼に中止するかどうか、またはスレッドが自発的に終了するのを待つかどうかをCLRが判断するのに役立つ単純なフラグです。

プログラムの終了時にスレッドプールスレッドを実行し続ける場合は、プロパティを変更するだけです。このスニペットは、それがどのように可能であるかを示しています。

using System;
using System.Threading;

class Program {
    static void Main(string[] args) {
        var sync = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem((_) => {
            Console.WriteLine("Running");
            Thread.CurrentThread.IsBackground = false;
            sync.Set();
            Thread.Sleep(5000);
            Console.WriteLine("Done, should exit now");
            Thread.Sleep(250);
        });
        sync.WaitOne();  // Ensures IsBackground is set
    }
}

ここでボールに目を離さないでください。これがあなたにとって重要である場合、あなたが何か間違ったことをしている可能性が高いです。

于 2013-01-31T17:55:10.623 に答える
2

スレッドプールスレッドをフォアグラウンドとして設定できます。

class Program
{
    static void Main(string[] args)
    {
        new Action(() => Worker()).BeginInvoke(null,null);

        Thread.Sleep(1000);
        Console.WriteLine("Main ends here");
    }

    static void Worker()
    {
        Thread.CurrentThread.IsBackground = false;

        Console.WriteLine("Worker started. Bg {0} Tp {1}.", 
            Thread.CurrentThread.IsBackground, 
            Thread.CurrentThread.IsThreadPoolThread);

        Thread.Sleep(5000);
        Console.WriteLine("Worker ends here");
于 2013-01-31T23:24:57.050 に答える
0

私はあなたができるとは思わない、あなたはこれをするためにカスタムスレッドプールを考え出さなければならないだろう。

管理対象スレッドプール内のスレッドはバックグラウンドスレッドです。つまり、それらのIsBackgroundプロパティはtrueです。これは、すべてのフォアグラウンドスレッドが終了した後、ThreadPoolスレッドがアプリケーションの実行を維持しないことを意味します。

スレッドプールスレッドを使用しない場合

スレッドプールスレッドを使用する代わりに、独自のスレッドを作成および管理することが適切なシナリオがいくつかあります。

  • 前景スレッドが必要です。

このリンクから そしてこれ

于 2013-01-31T17:13:06.547 に答える