- [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
- [SOFTWARE] Giới thiệu bộ phần mềm tính Kết Cấu Thép HatteSale, Mộng Đơn, Dầm, Sàn, Móng Cọc, Vách, Xà Gồ, Tính Tải Trọng
- [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
- Hướng dẫn khóa file bằng nhiều process id, không cho xóa tập tin
- Hướng dẫn cách tạo Product Id cho ứng dụng phần mềm XXXXX-XXXXX-XXXXX-XXXXX
- [SQLSERVER] Hướng dẫn tạo script sql từ ứng dụng Sqlserver management Studio
- [C#] Hướng dẫn sử dụng thư viện AutoITx lấy id và password Ultraviewer trên winform
- [VB.NET] Hướng dẫn lấy thông tin tài khoản đăng nhập windows và khởi động lại ứng dụng ở chế độ Administrator
- [C#] Sử dụng thư viện Polly gửi lại request api khi request bị lỗi hay rớt mạng
- [DEVEXPRESS] Chia sẻ source code tạo báo cáo report in tem nhãn label trên C# winform
- [DEVEXPRESS] Hướng dẫn vẽ biểu đồ Bar Chart trên Winform
- [C#] Tạo form đăng nhập và đăng ký với hiệu ứng Sliding Animation Effect
- [C#] Hướng dẫn tạo thanh toán đơn hàng qua mã vạch VietQR sử dụng API PayOS hoàn toàn miễn phí
- [C#] Hướng dẫn ghi log ra RichTextBox giống Console trên Winform sử dụng thư viện Serilog
- [C#] Hướng dẫn cách tạo mã QR Code trên file Excel
[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!