私の問題を示すためにこのクラスがあります:
class Program
{
static List<FileInfo> _foundFiles;
static int _numberPadding = 0;
static Thread newThread;
static void Main(string[] args)
{
_foundFiles = new List<FileInfo>();
_shouldStop = false;
newThread = new Thread(new ThreadStart(StartSearch));
newThread.Start();
newThread.Join();
Console.WriteLine("Finished");
Console.ReadKey();
}
static volatile bool _shouldStop;
static void StartSearch()
{
IterateFileSystemNon(new DirectoryInfo(@"D:\OLD Melman\Music Backup\iTunes 28-06-11\Music"));
}
static void IterateFileSystemNon(DirectoryInfo folder)
{
string pad = CreatePadding();
Console.WriteLine("{0} Directory: {1}", pad, folder.Name);
foreach (var dir in folder.GetDirectories())
IterateFileSystemNon(dir);
pad = CreatePadding();
foreach (var file in folder.GetFiles())
{
if (file.Extension.Contains("mp3"))
{
_foundFiles.Add(file);
Console.WriteLine("{0} File: {1}", pad, file.Name);
}
}
_numberPadding = _numberPadding - 6;
}
static string CreatePadding()
{
_numberPadding = _numberPadding + 3;
var stringRepOfPadding = new StringBuilder(_numberPadding);
for (int i = 0; i < _numberPadding; i++)
{
stringRepOfPadding.Append(" ");
}
return stringRepOfPadding.ToString();
}
}
私はこれらの質問があります:
- これはコンソール アプリでは機能しますが、WindowsFormsApplication では機能しません。
Join
ステートメントに直行するだけです。これはなぜですか? - Microsoft が述べている Join ステートメントの場合、「生成されたスレッドが終了するまで現在のスレッドをブロックすると想定されます」。確かにこれはマルチスレッドの目的を無効にしますか? 私の WindowsFormsApplication では、このスレッドがタスクを実行している間、スレッドをブロックしたくありません。
- Join が必要な理由。確かに、私の Iteration void が反復を完了すると、スレッドは終了するはずですか?!
- 新しいスレッド内で、スレッドが終了したことをどのように示して、スレッドを閉じますか?