1.ในกรณีที่เรามีไฟล์จำนวนมาก แล้วต้องการนำรายละเอียดมาลงใน datagridview ควรจะทำยังไงให้ทำให้การทำงานเร็วขึ้นครับ
ตอนนี้ เขียนแบบนี้ครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ private void button4_Click(object sender, EventArgs e)
{
List<string> dirs = new List<string> > );
foreach (ListViewItem item in listView1.Items)
{
if(Directory.Exists(item.Text))
dirs.Add(item.Text);
}
if (dirs.Count > 0)
{
Task.Factory.StartNew(() =>
{
List<Task> tasks = new List<Task>> );
LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(2);
// Create a TaskFactory and pass it our custom scheduler.
TaskFactory factory = new TaskFactory(lcts);
CancellationTokenSource cts = new CancellationTokenSource();
List<string> files = new List<string>> );
label1.Invoke(new Action(() => label1.Text = "Adding:Files" ));
dirs.ForEach(dir =>
{
files.AddRange(Directory.GetFiles(dir,"*",SearchOption.AllDirectories));
// tasks.Add(Task.Factory.StartNew(() => { files.AddRange(Directory.GetFiles(dir, "*", SearchOption.AllDirectories)); }));
});
Task.WaitAll(tasks.ToArray());
cts.Dispose();
if (files.Count > 0)
{
Items items = new Items();
myProgressBar1.Invoke(new Action(() => { myProgressBar1.Maximum = files.Count; myProgressBar1.Value = 0; }));
tasks = new List<Task>> );
lcts = new LimitedConcurrencyLevelTaskScheduler(10);
// Create a TaskFactory and pass it our custom scheduler.
factory = new TaskFactory(lcts);
cts = new CancellationTokenSource();
files.ForEach(f =>
{
tasks.Add(Task.Factory.StartNew(() => {
System.Threading.Thread.Sleep(200);
/* dataGridView1.Invoke(new Action(() =>
{
dataGridView1.Rows.Add(false, Path.GetFileName(f), f, new FileInfo(f).Length, File.GetLastWriteTime(f), Ext.CalculateMD5(f));
}));*/
items.Add(f);
label1.Invoke(new Action(() => label1.Text = "Adding:" + f));
myProgressBar1.Invoke(new Action(() => { myProgressBar1.Value ++; }));
// if(myProgressBar1.Value % 10 == 0) System.Threading.Thread.Sleep(2000);
}));
});
Task.WaitAll(tasks.ToArray());
cts.Dispose();
dataGridView1.Invoke(new Action(() =>
{
dataGridView1.DataSource = items.DataItems ;
}));
}
label1.Invoke(new Action(() => label1.Text = "get Files Complete"));
});
}
}
CalculateMD5
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ public static string CalculateMD5(string filename)
{
try
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
var hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
}
catch { return ""; }
}
เท่าที่ทดสอบดู เหมือนจะช้าๆ ทั้งที่ทำงาน 10 task พร้อมๆกัน ครับ
100 กว่าไฟล์ทำงนไปเกินกว่า 5 นาทีได้ครับ
2. การ select ใน datatable ที่ต้องการ select เฉพาะข้อมูลที่มีมากกว่า 1 ข้อมูล ครับ
เขียนแบบนี้แล้วเกิด Error
Sourcecode
EasyDuplicateFinder
C# ขอสอบถามเรื่องการจัดการไฟล์ ครับ
ตอนนี้ เขียนแบบนี้ครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
CalculateMD5
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
เท่าที่ทดสอบดู เหมือนจะช้าๆ ทั้งที่ทำงาน 10 task พร้อมๆกัน ครับ
100 กว่าไฟล์ทำงนไปเกินกว่า 5 นาทีได้ครับ
2. การ select ใน datatable ที่ต้องการ select เฉพาะข้อมูลที่มีมากกว่า 1 ข้อมูล ครับ
เขียนแบบนี้แล้วเกิด Error
Sourcecode
EasyDuplicateFinder