|
|
|
WinApp C# ใช้งาน task กับ form แล้ว ค้างตลอดครับ |
|
|
|
|
|
|
|
คือลองใช้ task ดูแล้วเหมือนจะค้างๆหน่วงๆ ไม่เหมือนที่เรียกใช้แบบ thread ครับ
Code (C#)
void TaskGetFileTask()
{
DateTime s = DateTime.Now;
this.Invoke(new Action(() => {this.Text = "runing...." ;}));
string[] dir = System.IO.Directory.GetDirectories(@"g:\TestCSharp", "*.*", System.IO.SearchOption.TopDirectoryOnly);
var tasks = new Task[dir.Length-1];
this.Invoke(new Action(() => { this.Text = "Getfiles" ; }));
for (int i = 0; i < dir.Length-1; i++)
{
tasks[i] = Task.Run(() =>
{ System.IO.Directory.GetFiles(dir[i], "*.*", System.IO.SearchOption.AllDirectories).ToList<string>()
.ForEach(f => { richTextBox1.Invoke(new Action(() => { richTextBox1.Text += "\n" + f; })); });
});
}
try
{
Task.WaitAll(tasks);
}
catch { }
richTextBox1.Invoke(new Action(() => { richTextBox1.Text += "\n Status of completed tasks:"; }));
foreach (var t in tasks)
richTextBox1.Invoke(new Action(() => { richTextBox1.Text += "\n " + string.Format(" Task #{0}: {1}", t.Id, t.Status); }));
DateTime ss = DateTime.Now;
TimeSpan ts = ss-s;
this.Invoke(new Action(() => { this.Text = "run complete.. Time:" + ts.Hours+":" + ts.Minutes+":" + ts.Seconds + " " + ts.Milliseconds; }));
}
void TaskGetFileThread()
{
DateTime s = DateTime.Now;
this.Invoke(new Action(() => { this.Text = "runing...."; }));
string[] dir = System.IO.Directory.GetDirectories(@"g:\TestCSharp", "*.*", System.IO.SearchOption.TopDirectoryOnly);
this.Invoke(new Action(() => { this.Text = "Getfiles"; }));
for (int i = 0; i < dir.Length - 1; i++)
{
System.IO.Directory.GetFiles(dir[i], "*.*", System.IO.SearchOption.AllDirectories).ToList<string>()
.ForEach(f => { richTextBox1.Invoke(new Action(() => { richTextBox1.Text += "\n" + f; })); });
}
richTextBox1.Invoke(new Action(() => { richTextBox1.Text += "\n Status of completed tasks:"; }));
DateTime ss = DateTime.Now;
TimeSpan ts = ss - s;
this.Invoke(new Action(() => { this.Text = "run complete.. Time:" + ts.Hours + ":" + ts.Minutes + ":" + ts.Seconds + " " + ts.Milliseconds; }));
}
เรียกใช้
Code (C#)
new Thread(TaskGetFileTask).Start();
new Thread(TaskGetFileThread).Start();
การทดสอบพบว่า Task จะหน่วงๆ มากกว่า thread พอสมควร และถ้าใช้งานเยอะๆ Task จะ เอ๋อแดรกไปเลย 555
ผมเข้าใจว่า ถึงจะแยก Task ทำงานก็ตาม Task[dir.Length-1] แต่ทั้งหมดทำงานภายใต้ thread เดียวจาก
var tasks = new Task[dir.Length-1];
ซึ่งต่างกับ thread ที่แยกกันแบบอิสระอยู่แล้วจึงแบ่ง memory ได้ดีกว่า
ผมอยากเอาทั้ง 2 อย่างมาใช้งานร่วมกันโดย
1.แบ่งงานอย่างอิสระเพื่อไม่ให้ GUI ติดขัดหรือ Error
2.สามารถติดตามหรือดูได้ว่า work ไหนเสร็จก่อนเสร็จหลัง
แบบนี้ต้องทำยังไงครับ
Tag : .NET, Win (Windows App), C#, VS 2012 (.NET 4.x), VS 2013 (.NET 4.x)
|
|
|
|
|
|
Date :
2017-08-19 11:04:38 |
By :
lamaka.tor |
View :
1994 |
Reply :
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 00
|