-5

我有一些操作(我使用 WPF)。我不会在单独的线程中运行它们。我该怎么做?

例子:

foreach (string d in Directory.GetDirectories(sDir)) 
{
    foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
    {
        lstFilesFound.Items.Add(f);
    }
    DirSearch(d);
}
4

2 回答 2

2

如果您使用的是 .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; }
        }
    }
于 2012-11-09T20:05:22.703 回答
1

如果您正在使用 WPF 并且需要使用多线程,则必须从将 UI 与业务逻辑分离开始,否则您将得到无穷无尽的Dispatcher.Invoke()调用链。

正如另一个答案还指出,请参阅任务并行库以简化多线程应用程序的开发,但请注意 WPF UIElements 的属性只能由创建它们的线程(通常称为调度程序线程)访问。

于 2012-11-09T20:12:11.077 回答