【发布时间】:2013-01-13 22:35:22
【问题描述】:
我有这门课来演示我的问题:
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 中,我不想在该线程运行它的任务时阻塞任何线程。
- 为什么我需要加入。当然,当我的 Iteration void 完成迭代时,线程应该终止?!
- 我如何在新线程内部表明它已完成以便关闭线程?
【问题讨论】:
-
我不明白这段代码如何演示任何问题。您能否更详细地描述控制台和表单应用程序之间的行为差异?
-
在表单应用程序中,您几乎肯定希望直接使用
BackgroundWorker而不是Thread。 -
取出
newThread.Join(),你会看到问题!!! -
我已经执行了这段代码,它的行为与 我 所期望的完全一样。问题是它的行为不像你期望或期望的那样,但你没有清楚地传达那是什么。这就是我要求澄清的原因。
标签: c# winforms multithreading