비동기 방법에서 비동기 조작 취소
5479 단어 C#비동기 방법에서 비동기 조작 취소
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token; // CancellationTokenSource cts CancellationToken token
2. CancellationTokenSource의 Cancel() 방법을 호출하여 비동기적 방법 또는 비동기적 방법 중의 await 표현식 중의 CancellationToken의 IsCancellationRequested 속성을 True로 하여 비동기적 방법 또는 비동기적 방법 중의 await 표현식의 집행을 중지한다.
public async Task RunAsync(CancellationToken ct)// CancellationToken
{
if(ct.IsCancellationRequested)
{
return;
}
await Task.Run(() => CycleMethod(ct), ct);//public static Task Run(Action action, CancellationToken cancellationToken); Action , CycleMethod
} // Run
3. 비동기적 방법이나 비동기적 방법 중의 await 표현식은 모두 CancellationToken 유형의 참조를 포함하고 프로그램이CancellationTokenSource류의 Cancel() 방법을 호출하면 비동기적 방법과 await 표현식에서 CancellationToken의 IsCancellationRequested 속성이 True로 검출되면 종료된다.
프로그램 1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _CancellationToken
{
class Program
{
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token; // CancellationTokenSource cts CancellationToken token
MyClass mc = new MyClass();
Task t = mc.RunAsync(token);
Thread.Sleep(3000);// 3
cts.Cancel();
t.Wait();
Console.WriteLine("Was Cancelled: {0}",token.IsCancellationRequested);
Console.ReadKey();
}
}
class MyClass
{
public async Task RunAsync(CancellationToken ct)// CancellationToken
{
if(ct.IsCancellationRequested)
{
return;
}
await Task.Run(() => CycleMethod(ct), ct);//public static Task Run(Action action, CancellationToken cancellationToken); Action , CycleMethod
} // Run
void CycleMethod(CancellationToken ct)
{
Console.WriteLine("Starting CycleMethod");
const int Max = 5;
for (int i = 0; i < Max; i++)
{
if (ct.IsCancellationRequested)
{
return;
}
Thread.Sleep(1000);
Console.WriteLine(" {0} of {1} iterations completed",i+1,Max);
}
}
}
}
프로그램 2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Process
{
public partial class Form1 : Form
{
CancellationTokenSource _cancellationTokenSource;
CancellationToken _cancellationToken;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private async void btnprocess_Click(object sender, EventArgs e)
{
btnprocess.Enabled = false;
_cancellationTokenSource = new CancellationTokenSource();
_cancellationToken = new CancellationToken();
_cancellationToken = _cancellationTokenSource.Token; // _cancellationTokenSource _cancellationToken
int completedPercent = 0;
for (int i = 0; i < 10; i++)
{
if (_cancellationToken.IsCancellationRequested)
{
break;
}
try // await
{
await Task.Delay(500, _cancellationToken); //await Task.Delay(50);
//Thread.Sleep(1000);
completedPercent = (i+1)*10;
}
catch (TaskCanceledException ex)
{
completedPercent = i * 10;
}
progressBar1.Value = (i+1) * 10; //
this.textBox1.Text = progressBar1.Value.ToString(); //Text
}
string message = _cancellationToken.IsCancellationRequested ? string.Format("Process was canceled at {0}%", completedPercent) : "Process completed normally";
MessageBox.Show(message,"Completion Status");
progressBar1.Value = 0;
btnprocess.Enabled = true;
btnCancel.Enabled = true;
}
private void btnCancel_Click(object sender, EventArgs e)
{
if (!btnprocess.Enabled)
{
btnCancel.Enabled = false;
_cancellationTokenSource.Cancel(); // CancellationTokenSource Cancel CancellationToken IsCancellationRequested True ,
this.textBox1.Text = "";
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.