- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Start, Pause Token , CancelSourceToken trong Task Parallelism
Xin chào các bạn, bài viết hôm nay mình sẽ tiếp tục hướng dẫn các bạn cách Start, Pause, Resume và Stop trong Task Parallel C# Winform.
Trong NetFramework, thì Task có hỗ trợ CancelSourceToken, còn PauseTokenSource thì không có hỗ trợ.
Nên chúng ta cần viết thêm hai class PauseToken
và PauseTokenSource
.
Giao diện demo ứng dụng Start, Pause, Resume, Stop Task Parallel C#:
- Tạo Class PauseTokenSource.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace PauseTokenSource
{
class PauseTokenSource
{
private volatile TaskCompletionSource<bool> m_paused;
internal static readonly Task s_completedTask = Task.FromResult(true);
public bool IsPaused
{
get { return m_paused != null; }
set
{
if (value)
{
Interlocked.CompareExchange(
ref m_paused, new TaskCompletionSource<bool>(), null);
}
else
{
while (true)
{
var tcs = m_paused;
if (tcs == null) return;
if (Interlocked.CompareExchange(ref m_paused, null, tcs) == tcs)
{
tcs.SetResult(true);
break;
}
}
}
}
}
public PauseToken Token { get { return new PauseToken(this); } }
internal Task WaitWhilePausedAsync()
{
var cur = m_paused;
return cur != null ? cur.Task : s_completedTask;
}
}
}
2. Tiếp tục tạo thêm Class PauseToken.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PauseTokenSource
{
class PauseToken
{
private readonly PauseTokenSource m_source;
internal PauseToken(PauseTokenSource source) { m_source = source; }
public bool IsPaused { get { return m_source != null && m_source.IsPaused; } }
public Task WaitWhilePausedAsync()
{
return IsPaused ?
m_source.WaitWhilePausedAsync() :
PauseTokenSource.s_completedTask;
}
}
}
3. Viết code cho Form Main ứng dụng Demo Task C#:
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PauseTokenSource
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
PauseTokenSource pts;
CancellationTokenSource cts;
private async void btnStart_Click(object sender, EventArgs e)
{
btnStart.Enabled = false;
btnPause.Enabled = true;
btnStop.Enabled = true;
rbResult.Clear();
cts = new CancellationTokenSource();
pts = new PauseTokenSource();
var tokenSource = cts.Token;
await SomeMethodAsync(tokenSource);
}
public async Task SomeMethodAsync(CancellationToken ct)
{
for (int i = 0; i <= 100; i++)
{
this.BeginInvoke(new Action(()=>
{
rbResult.Text += "i = " + i + "\r\n";
progressBar1.Value = i;
lbl_status.Text = i + "%";
if(i == 100)
{
MessageBox.Show("Finish");
btnStart.Enabled = true;
btnPause.Enabled = false;
btnStop.Enabled = false;
}
}));
if (ct.IsCancellationRequested)
{
break;
}
await Task.Delay(200);
await pts.WaitWhilePausedAsync();
}
}
private void btnPause_Click(object sender, EventArgs e)
{
pts.IsPaused = !pts.IsPaused;
if (pts.IsPaused)
{
btnPause.Text = "Resume";
}
else
{
btnPause.Text = "Pause";
}
}
private void btnStop_Click(object sender, EventArgs e)
{
cts.Cancel();
btnStart.Enabled = true;
btnPause.Enabled = false;
btnStop.Enabled = false;
}
}
}
Các bạn có thể download source code bên dưới về để tham khảo.
Thanks for watching!