## link
taskscheduler
ปกติผมจะรันให้ Datagridview เพิ่มให้ครบก่อน เพราะจะดึง RowCount ไปใส่ใน ProgressBar1.Maximum
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ myProgressBar1.Maximum = this.dataGridView1.RowCount ;
จากนั้นก็จะใช้ taskscheduler รันงาน ครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(8);
List<Task> tasks = new List<Task>);
// Create a TaskFactory and pass it our custom scheduler.
TaskFactory factory = new TaskFactory(lcts);
CancellationTokenSource cts = new CancellationTokenSource();
for (int i = 0; i < dataGridView1.RowCount; i++)
{
runLoad = true;
try
{
int rowIndex = i;
Task t = factory.StartNew(() => {
var client = new HttpClient();
long? totalByte = 0;
string name = dataGridView1[1, rowIndex].Value.ToString() + ".mp4";
string nameTemp = Path.GetTempPath() + "SongLoad\\" + Path.GetFileName(dataGridView1[1, rowIndex].Value.ToString()) + ".mp4";
string nameMP3 = dataGridView1[1, rowIndex].Value.ToString() + ".mp3";
if (File.Exists(name) || File.Exists(nameMP3))
{
dataGridView1.Invoke((MethodInvoker)(() => dataGridView1[5, rowIndex].Value = 100));
finish();
}
else
{
Directory.CreateDirectory(Path.GetDirectoryName(nameTemp));
Directory.CreateDirectory(Path.GetDirectoryName(name));
try
{
var vid = youTube.GetVideo(dataGridView1[2, rowIndex].Value.ToString());
dataGridView1.Invoke((MethodInvoker)(() => dataGridView1[5, rowIndex].Value = 0));
long totalbytes = 0;
long collectedbytes = 0;
using (Stream output = File.OpenWrite(nameTemp))
{
using (var request = new HttpRequestMessage(HttpMethod.Head, vid.Uri))
{
totalByte = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result.Content.Headers.ContentLength;
}
totalbytes += (long)totalByte;
Alltotalbytes += (long)totalByte;
try
{
using (var input = client.GetStreamAsync(vid.Uri).Result)
{
byte[] buffer = new byte[16 * 1024];
int read;
int totalRead = 0;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0 || collectedbytes < totalbytes)
{
output.Write(buffer, 0, read);
totalRead += read;
collectedbytes += read;
Allcollectedbytes += read;
long x = collectedbytes * 80 / totalbytes;
lblStatus.Write(TORServices.PathFile.FileTor.bytetobigger(Allcollectedbytes) + "/" + TORServices.PathFile.FileTor.bytetobigger(Alltotalbytes));
try
{
dataGridView1.Invoke((MethodInvoker)(() => dataGridView1[5, rowIndex].Value = (int)x));
}
catch { }
}
}
}
catch { dataGridView1.Invoke((MethodInvoker)(() => dataGridView1[5, rowIndex].Value = 100)); }
}
while (new FileInfo(nameTemp).Length < 10)
{
System.Threading.Thread.Sleep(10000);
}
if (SoundOnly.Checked)
{
_ = Task.Run(() => ConverttoMp3(nameTemp, nameMP3, rowIndex));
}
else
{
try
{
File.Move(nameTemp, name);
dataGridView1.Invoke((MethodInvoker)(() => dataGridView1[5, rowIndex].Value = 100));
}
catch { }
}
}
catch { }
client.Dispose();
finish();
}
}, cts.Token);
tasks.Add(t);
}
catch
{
dataGridView1.Invoke((MethodInvoker)(() => dataGridView1[5, i].Value = 100));
finish();
}
}
Task.WaitAll(tasks.ToArray());
cts.Dispose();
ผมใช้ for ในการ Add task คราวนี้ ผมอยากพัฒนาโดยที่ ขณะที่
Task.WaitAll(tasks.ToArray()); ทำงานอยู่
ผมอยากจะเพิ่มแถวใน dataGridView ด้วย และ เพิ่ม Task ใน tasks ด้วย เพื่อให้ทำงานต่อเนื่อง แบบนี้ได้ไม๊ ครับ
C# WinApp Task & Datagridview อยากทราบแนวทางการเพิ่มข้อมูลลงใน Datagridview ขณะ ที่ Task ทำงาน ครับ
ปกติผมจะรันให้ Datagridview เพิ่มให้ครบก่อน เพราะจะดึง RowCount ไปใส่ใน ProgressBar1.Maximum
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
จากนั้นก็จะใช้ taskscheduler รันงาน ครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ผมใช้ for ในการ Add task คราวนี้ ผมอยากพัฒนาโดยที่ ขณะที่
Task.WaitAll(tasks.ToArray()); ทำงานอยู่
ผมอยากจะเพิ่มแถวใน dataGridView ด้วย และ เพิ่ม Task ใน tasks ด้วย เพื่อให้ทำงานต่อเนื่อง แบบนี้ได้ไม๊ ครับ