我有一些操作(我使用 WPF)。我不会在单独的线程中运行它们。我该怎么做?
例子:
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, txtFile.Text))
{
lstFilesFound.Items.Add(f);
}
DirSearch(d);
}
我有一些操作(我使用 WPF)。我不会在单独的线程中运行它们。我该怎么做?
例子:
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, txtFile.Text))
{
lstFilesFound.Items.Add(f);
}
DirSearch(d);
}
如果您使用的是 .NET 4,则可以使用任务并行库
只是 C# .NET 4 控制台应用程序中的一个示例:
internal class Program
{
private static readonly object listLockObject = new object();
private static readonly IList<string> lstFilesFound = new List<string>();
private static readonly TxtFile txtFile = new TxtFile("Some search pattern");
private static string sDir = "Something";
public static void Main()
{
Parallel.ForEach(Directory.GetDirectories(sDir), GetMatchingFolderAndDoSomething);
}
private static void GetMatchingFolderAndDoSomething(string directory)
{
//This too can be parallelized.
foreach (string f in Directory.GetFiles(directory, txtFile.Text))
{
lock (listLockObject)
{
lstFilesFound.Add(f);
}
}
DirSearch(directory);
}
//Make this thread safe.
private static void DirSearch(string s)
{
}
public class TxtFile
{
public TxtFile(string text)
{
Text = text;
}
public string Text { get; private set; }
}
}
如果您正在使用 WPF 并且需要使用多线程,则必须从将 UI 与业务逻辑分离开始,否则您将得到无穷无尽的Dispatcher.Invoke()
调用链。
正如另一个答案还指出,请参阅任务并行库以简化多线程应用程序的开发,但请注意 WPF UIElements 的属性只能由创建它们的线程(通常称为调度程序线程)访问。