下面的代碼因錯誤「進程無法訪問該文件,因爲它正在被另一進程使用」而失敗。我難以理解什麼是錯的。我以管理員身份運行Visual Studio,而非文件在記事本中打開。c#線程訪問問題
private void Load_Click(object sender, RoutedEventArgs e)
{
if (txtInput.Text.Length > 1) {
//var rootDir = System.IO.Directory.GetCurrentDirectory();
string rootDir = @"C:\b";
string search = txtInput.Text.Replace(" ", "");
List<Thread> searches = new List<Thread>();
foreach (var file in new DirectoryInfo(rootDir).GetFiles().Where(z => z.LastWriteTime > DateTime.Now.AddDays(-7))) {
if (file.ToString().Contains(".log")) {
searches.Add(new Thread(new ThreadStart(() => AddDropdownItem(file.ToString(),search))));
}
}
//Run ten threads at a time and wait for them to finish
for (int i = 0; i < searches.Count; i = i + 10) {
List<Thread> pool = new List<Thread>();
for (int j = 0; j < 10; j++) {
if (i + j < searches.Count) {
Thread t = searches[(i + j)];
pool.Add(t);
}
}
foreach (Thread t in pool) {
t.Start();
}
foreach (Thread t in pool) {
t.Join();
}
}
}
}
private void AddDropdownItem(string file, string search)
{
if (GetFileContent(file.ToString()).Contains(search)) {
ComboBoxItem item = new ComboBoxItem();
item.Content = file.ToString();
Dispatcher.BeginInvoke(new ThreadStart(() => ddFiles.Items.Add(item)));
}
}
private string GetFileContent(string file)
{
string path = System.IO.Path.Combine(@"C:\b", file);
using (FileStream fs = new FileStream(path, FileMode.Open)) {
return new StreamReader(fs).ReadToEnd();
}
}
+1作爲對未評論的downvote的支持 – sra 2011-05-19 13:06:02
爲什麼要在你的字符串上調用.ToString()? – thumbmunkeys 2011-05-19 13:08:09